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> 27efada569e6292923ff5d537ab1fbc7a6039c10bbDongwon Kang#include <media/stagefright/foundation/ByteUtils.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" 352279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/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 81330d876a6273ca8e957933d7e63aaed577883e34Ivan Lozanousing media::VolumeShaper; 82330d876a6273ca8e957933d7e63aaed577883e34Ivan Lozano 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID context; 871ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg jfieldID surface_texture; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID post_event; 90d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 91d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetHost; 92d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetPort; 93d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber jmethodID proxyConfigGetExclusionList; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9723dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic BufferingParams::fields_t gBufferingParamsFields; 982d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic PlaybackParams::fields_t gPlaybackParamsFields; 992d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic SyncParams::fields_t gSyncParamsFields; 100035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic VolumeShaperHelper::fields_t gVolumeShaperFields; 101b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex sLock; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ref-counted object for callbacks 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JNIMediaPlayerListener: public MediaPlayerListener 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~JNIMediaPlayerListener(); 111162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIMediaPlayerListener(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; // Reference to MediaPlayer class 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject mObject; // Weak ref to MediaPlayer Java object to call on 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz) 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Hold onto the MediaPlayer class for use in calling the static method 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // that posts events to the application thread. 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->GetObjectClass(thiz); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clazz == NULL) { 1253762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Can't find android/media/MediaPlayer"); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/Exception", NULL); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClass = (jclass)env->NewGlobalRef(clazz); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We use a weak reference so the MediaPlayer object can be garbage collected. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The reference is only used as a proxy for callbacks. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mObject = env->NewGlobalRef(weak_thiz); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::~JNIMediaPlayerListener() 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remove global references 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mClass); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wangvoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv *env = AndroidRuntime::getJNIEnv(); 147162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang if (obj && obj->dataSize() > 0) { 148333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang jobject jParcel = createJavaParcelObject(env); 149333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang if (jParcel != NULL) { 150333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang Parcel* nativeParcel = parcelForJavaObject(env, jParcel); 1518902097bb686752ff207e3bda12713be1a8c74ebInsun Kang nativeParcel->setData(obj->data(), obj->dataSize()); 152162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 153333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang msg, ext1, ext2, jParcel); 15499f752149b1a0df9ea0ba311d609d4d6e103787cElliott Hughes env->DeleteLocalRef(jParcel); 155162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 156162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } else { 157162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang env->CallStaticVoidMethod(mClass, fields.post_event, mObject, 158162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang msg, ext1, ext2, NULL); 159162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang } 1608902097bb686752ff207e3bda12713be1a8c74ebInsun Kang if (env->ExceptionCheck()) { 1618902097bb686752ff207e3bda12713be1a8c74ebInsun Kang ALOGW("An exception occurred while notifying an event."); 1628902097bb686752ff207e3bda12713be1a8c74ebInsun Kang LOGW_EX(env); 1638902097bb686752ff207e3bda12713be1a8c74ebInsun Kang env->ExceptionClear(); 1648902097bb686752ff207e3bda12713be1a8c74ebInsun Kang } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 172075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sp<MediaPlayer>(p); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player) 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex::Autolock l(sLock); 179075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (player.get()) { 181b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian player->incStrong((void*)setMediaPlayer); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old != 0) { 184b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old->decStrong((void*)setMediaPlayer); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 186075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.context, (jlong)player.get()); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return old; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19032f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// If exception is NULL and opStatus is not OK, this method sends an error 19132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// event to the client application; otherwise, if exception is not NULL and 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// opStatus is not OK, this method throws the given exception to the client 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// application. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message) 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (exception == NULL) { // Don't throw exception. Instead, send an event. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (opStatus != (status_t) OK) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { // Throw exception! 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( opStatus == (status_t) INVALID_OPERATION ) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 20405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } else if ( opStatus == (status_t) BAD_VALUE ) { 20505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 206fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke } else if ( opStatus == (status_t) PERMISSION_DENIED ) { 207fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke jniThrowException(env, "java/lang/SecurityException", NULL); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ( opStatus != (status_t) OK ) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (strlen(message) > 230) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if the message is too long, don't bother displaying the status code 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, message); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char msg[256]; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // append the status code to the message 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sprintf(msg, "%s: status=0x%X", message, opStatus); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException( env, exception, msg); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 223256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberandroid_media_MediaPlayer_setDataSourceAndHeaders( 224d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path, 22517524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong jobjectArray keys, jobjectArray values) { 22617524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (path == NULL) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 238c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong const char *tmp = env->GetStringUTFChars(path, NULL); 239c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong if (tmp == NULL) { // Out of memory 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSource: path %s", tmp); 243256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 244c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong String8 pathStr(tmp); 245c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong env->ReleaseStringUTFChars(path, tmp); 246c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong tmp = NULL; 247c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong 24817524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong // We build a KeyedVector out of the key and val arrays 24917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong KeyedVector<String8, String8> headersVector; 25079f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong if (!ConvertKeyValueArraysToKeyedVector( 25179f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong env, keys, values, &headersVector)) { 25279f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong return; 253256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber } 254256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 255d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IMediaHTTPService> httpService; 256d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (httpServiceBinderObj != NULL) { 257d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj); 258d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService = interface_cast<IMediaHTTPService>(binder); 259d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 260d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 261256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber status_t opStatus = 262256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber mp->setDataSource( 263d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService, 264c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong pathStr, 26579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong headersVector.size() > 0? &headersVector : NULL); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 267256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber process_media_player_call( 268256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber env, thiz, opStatus, "java/io/IOException", 269256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber "setDataSource failed." ); 270256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber} 271256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber 272256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberstatic void 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fileDescriptor == NULL) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 285a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 28671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setDataSourceFD: fd %d", fd); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." ); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2904eaa2938084353a54dc259466172909329a048ccChris Watkinsstatic void 2914eaa2938084353a54dc259466172909329a048ccChris Watkinsandroid_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource) 2924eaa2938084353a54dc259466172909329a048ccChris Watkins{ 2934eaa2938084353a54dc259466172909329a048ccChris Watkins sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 2944eaa2938084353a54dc259466172909329a048ccChris Watkins if (mp == NULL ) { 2954eaa2938084353a54dc259466172909329a048ccChris Watkins jniThrowException(env, "java/lang/IllegalStateException", NULL); 2964eaa2938084353a54dc259466172909329a048ccChris Watkins return; 2974eaa2938084353a54dc259466172909329a048ccChris Watkins } 2984eaa2938084353a54dc259466172909329a048ccChris Watkins 2994eaa2938084353a54dc259466172909329a048ccChris Watkins if (dataSource == NULL) { 3004eaa2938084353a54dc259466172909329a048ccChris Watkins jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 3014eaa2938084353a54dc259466172909329a048ccChris Watkins return; 3024eaa2938084353a54dc259466172909329a048ccChris Watkins } 3034eaa2938084353a54dc259466172909329a048ccChris Watkins sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource); 3044eaa2938084353a54dc259466172909329a048ccChris Watkins process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." ); 3054eaa2938084353a54dc259466172909329a048ccChris Watkins} 3064eaa2938084353a54dc259466172909329a048ccChris Watkins 307d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstatic sp<IGraphicBufferProducer> 3081ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted BonkenburggetVideoSurfaceTexture(JNIEnv* env, jobject thiz) { 309075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture); 310d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden return sp<IGraphicBufferProducer>(p); 3118b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 314d59310d08637c8531dc7949fc166b0daeede53c0Gloria WangdecVideoSurfaceRef(JNIEnv *env, jobject thiz) 315d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang{ 316e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 317e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang if (mp == NULL) { 318e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang return; 319e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang } 320e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang 321d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz); 322d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang if (old_st != NULL) { 323b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian old_st->decStrong((void*)decVideoSurfaceRef); 324d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang } 325d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang} 326d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 327d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wangstatic void 32843ef913815ec84d04877a698614a31e129cd97e3James DongsetVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive) 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 33143ef913815ec84d04877a698614a31e129cd97e3James Dong if (mp == NULL) { 33243ef913815ec84d04877a698614a31e129cd97e3James Dong if (mediaPlayerMustBeAlive) { 33343ef913815ec84d04877a698614a31e129cd97e3James Dong jniThrowException(env, "java/lang/IllegalStateException", NULL); 33443ef913815ec84d04877a698614a31e129cd97e3James Dong } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3371ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 338d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 339d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 340d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> new_st; 3411ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (jsurface) { 34264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown sp<Surface> surface(android_view_Surface_getSurface(env, jsurface)); 343f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis if (surface != NULL) { 34452800617946c456e78ed010c82d0ec4358368164Mathias Agopian new_st = surface->getIGraphicBufferProducer(); 345097922b9c1e0821beb107024bcd0dc14144c0920James Dong if (new_st == NULL) { 346097922b9c1e0821beb107024bcd0dc14144c0920James Dong jniThrowException(env, "java/lang/IllegalArgumentException", 347097922b9c1e0821beb107024bcd0dc14144c0920James Dong "The surface does not have a binding SurfaceTexture!"); 348097922b9c1e0821beb107024bcd0dc14144c0920James Dong return; 349097922b9c1e0821beb107024bcd0dc14144c0920James Dong } 350b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian new_st->incStrong((void*)decVideoSurfaceRef); 351f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } else { 352f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis jniThrowException(env, "java/lang/IllegalArgumentException", 353f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis "The surface has been released"); 354f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis return; 355f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis } 3561ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg } 357d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang 358075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get()); 3591ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 3601ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // This will fail if the media player has not been initialized yet. This 3611ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // can be the case if setDisplay() on MediaPlayer.java has been called 3621ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // before setDataSource(). The redundant call to setVideoSurfaceTexture() 3631ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // in prepare/prepareAsync covers for this case. 3641ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(new_st); 3658b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks} 3668b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks 3678b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksstatic void 36843ef913815ec84d04877a698614a31e129cd97e3James Dongandroid_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface) 36943ef913815ec84d04877a698614a31e129cd97e3James Dong{ 37043ef913815ec84d04877a698614a31e129cd97e3James Dong setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */); 37143ef913815ec84d04877a698614a31e129cd97e3James Dong} 37243ef913815ec84d04877a698614a31e129cd97e3James Dong 37323dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic jobject 37423dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_getBufferingParams(JNIEnv *env, jobject thiz) 37523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{ 37623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 37723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (mp == NULL) { 37823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 37923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return NULL; 38023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 38123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 38223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingParams bp; 38323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingSettings &settings = bp.settings; 38423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia process_media_player_call( 38523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia env, thiz, mp->getBufferingSettings(&settings), 38623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia "java/lang/IllegalStateException", "unexpected error"); 3874480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang if (env->ExceptionCheck()) { 3884480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang return nullptr; 3894480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang } 39023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia ALOGV("getBufferingSettings:{%s}", settings.toString().string()); 39123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 39223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return bp.asJobject(env, gBufferingParamsFields); 39323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia} 39423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 39523dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic void 39623dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_setBufferingParams(JNIEnv *env, jobject thiz, jobject params) 39723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{ 39823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (params == NULL) { 39923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return; 40023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 40123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 40223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 40323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia if (mp == NULL) { 40423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 40523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia return; 40623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia } 40723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 40823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia BufferingParams bp; 40923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia bp.fillFromJobject(env, gBufferingParamsFields, params); 41023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia ALOGV("setBufferingParams:{%s}", bp.settings.toString().string()); 41123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 41223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia process_media_player_call( 41323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia env, thiz, mp->setBufferingSettings(bp.settings), 41423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia "java/lang/IllegalStateException", "unexpected error"); 41523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia} 41623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia 41743ef913815ec84d04877a698614a31e129cd97e3James Dongstatic void 4188b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz) 4198b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks{ 4208b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4218b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks if (mp == NULL ) { 4228b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks jniThrowException(env, "java/lang/IllegalStateException", NULL); 4238b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks return; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4251ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4261ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 4271ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 428d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 4291ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 4301ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." ); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz) 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4421ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4431ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // Handle the case where the display surface was set before the mp was 4441ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg // initialized. We try again to make it stick. 445d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz); 4461ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg mp->setVideoSurfaceTexture(st); 4471ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." ); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz) 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 45471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("start"); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->start(), NULL, NULL ); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz) 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 46671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("stop"); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 47232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania process_media_player_call( env, thiz, mp->stop(), NULL, NULL ); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz) 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 47871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("pause"); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->pause(), NULL, NULL ); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz) 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 493075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4954df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project const jboolean is_playing = mp->isPlaying(); 4964df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 49771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isPlaying: %d", is_playing); 4984df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project return is_playing; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 5022d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params) 503d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia{ 504d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 505d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia if (mp == NULL) { 506d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 507d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia return; 508d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia } 509b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5102d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia PlaybackParams pbp; 5112d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.fillFromJobject(env, gPlaybackParamsFields, params); 5122d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", 5132d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.speedSet, pbp.audioRate.mSpeed, 5142d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.pitchSet, pbp.audioRate.mPitch, 5152d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode, 5162d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioStretchModeSet, pbp.audioRate.mStretchMode); 517b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 51805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar AudioPlaybackRate rate; 51905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar status_t err = mp->getPlaybackSettings(&rate); 52005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (err == OK) { 52105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar bool updatedRate = false; 5222d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.speedSet) { 5232d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mSpeed = pbp.audioRate.mSpeed; 52405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 52505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5262d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.pitchSet) { 5272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mPitch = pbp.audioRate.mPitch; 52805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 52905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5302d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.audioFallbackModeSet) { 5312d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mFallbackMode = pbp.audioRate.mFallbackMode; 53205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 53305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 5342d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (pbp.audioStretchModeSet) { 5352d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia rate.mStretchMode = pbp.audioRate.mStretchMode; 53605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedRate = true; 53705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 53805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (updatedRate) { 53905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar err = mp->setPlaybackSettings(rate); 54005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 54105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 54205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 54305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, err, 54405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 545b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar} 546b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 547b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnarstatic jobject 5482d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz) 549b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar{ 550b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 551b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar if (mp == NULL) { 552b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 553b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar return NULL; 554b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar } 555b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia PlaybackParams pbp; 5572d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia AudioPlaybackRate &audioRate = pbp.audioRate; 55805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 55905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, mp->getPlaybackSettings(&audioRate), 56005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 5614480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang if (env->ExceptionCheck()) { 5624480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang return nullptr; 5634480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang } 564b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar ALOGV("getPlaybackSettings: %f %f %d %d", 565b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode); 566b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5672d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.speedSet = true; 5682d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.pitchSet = true; 5692d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioFallbackModeSet = true; 5702d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia pbp.audioStretchModeSet = true; 571b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 5722d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia return pbp.asJobject(env, gPlaybackParamsFields); 573d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia} 574d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia 575d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jiastatic void 5762d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params) 577c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{ 578c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 579c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar if (mp == NULL) { 580c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 581c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar return; 582c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar } 583c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 5842d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia SyncParams scp; 5852d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.fillFromJobject(env, gSyncParamsFields, params); 5862d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f", 5872d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.syncSourceSet, scp.sync.mSource, 5882d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode, 5892d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.toleranceSet, scp.sync.mTolerance, 5902d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRateSet, scp.frameRate); 59105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 59205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar AVSyncSettings avsync; 59305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar float videoFrameRate; 59405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar status_t err = mp->getSyncSettings(&avsync, &videoFrameRate); 59505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (err == OK) { 5962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia bool updatedSync = scp.frameRateSet; 5972d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.syncSourceSet) { 5982d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mSource = scp.sync.mSource; 59905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 60005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 6012d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.audioAdjustModeSet) { 6022d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode; 60305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 60405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 6052d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.toleranceSet) { 6062d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia avsync.mTolerance = scp.sync.mTolerance; 60705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar updatedSync = true; 60805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 60905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar if (updatedSync) { 6102d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f); 61105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 61205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 61305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 61405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar env, thiz, err, 61505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 616c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar} 617c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 618c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic jobject 6192d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz) 620c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{ 621c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 622c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar if (mp == NULL) { 623c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 624c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar return NULL; 625c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar } 626c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 6272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia SyncParams scp; 6282d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRate = -1.f; 62905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar process_media_player_call( 6302d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate), 63105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar "java/lang/IllegalStateException", "unexpected error"); 6324480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang if (env->ExceptionCheck()) { 6334480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang return nullptr; 6344480127cadd2a285f726c820d0169a6aa1846477Dongwon Kang } 63505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 636c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar ALOGV("getSyncSettings: %d %d %f %f", 6372d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate); 63805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar 6392d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia // sanity check params 6402d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia if (scp.sync.mSource >= AVSYNC_SOURCE_MAX 6412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX 6422d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mTolerance < 0.f 6432d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) { 64405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar jniThrowException(env, "java/lang/IllegalStateException", NULL); 64505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar return NULL; 64605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar } 647c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 6482d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.syncSourceSet = true; 6492d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.audioAdjustModeSet = true; 6502d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.toleranceSet = true; 6512d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia scp.frameRateSet = scp.frameRate >= 0.f; 652c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 6532d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia return scp.asJobject(env, gSyncParamsFields); 654c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar} 655c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar 656c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic void 657bebeaf9ae3251e24a214951e6559cd40f15ef4fbWei Jiaandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jlong msec, jint mode) 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 664bebeaf9ae3251e24a214951e6559cd40f15ef4fbWei Jia ALOGV("seekTo: %lld(msec), mode=%d", (long long)msec, mode); 665bebeaf9ae3251e24a214951e6559cd40f15ef4fbWei Jia process_media_player_call( env, thiz, mp->seekTo((int)msec, (MediaPlayerSeekMode)mode), NULL, NULL ); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 668c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jiastatic void 669c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jiaandroid_media_MediaPlayer_notifyAt(JNIEnv *env, jobject thiz, jlong mediaTimeUs) 670c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia{ 671c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 672c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia if (mp == NULL) { 673c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia jniThrowException(env, "java/lang/IllegalStateException", NULL); 674c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia return; 675c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia } 676c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia ALOGV("notifyAt: %lld", (long long)mediaTimeUs); 677c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia process_media_player_call( env, thiz, mp->notifyAt((int64_t)mediaTimeUs), NULL, NULL ); 678c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia} 679c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia 680075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz) 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w; 6894df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoWidth(&w)) { 6903762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoWidth failed"); 6914df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project w = 0; 6924df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 69371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoWidth: %d", w); 694075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) w; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 697075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz) 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h; 7064df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project if (0 != mp->getVideoHeight(&h)) { 7073762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("getVideoHeight failed"); 7084df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project h = 0; 7094df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project } 71071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getVideoHeight: %d", h); 711075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) h; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7140e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essickstatic jobject 715f2d0e40bf01fa133dd6b36f3716005d53fa9776cRay Essickandroid_media_MediaPlayer_native_getMetrics(JNIEnv *env, jobject thiz) 7160e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick{ 7170e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7180e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick if (mp == NULL ) { 7190e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick jniThrowException(env, "java/lang/IllegalStateException", NULL); 7200e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick return 0; 7210e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick } 7220e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7230e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick Parcel p; 7240e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick int key = FOURCC('m','t','r','X'); 7250e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick status_t status = mp->getParameter(key, &p); 7260e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick if (status != OK) { 7270e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick ALOGD("getMetrics() failed: %d", status); 7280e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick return (jobject) NULL; 7290e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick } 7300e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7310e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick MediaAnalyticsItem *item = new MediaAnalyticsItem; 7320e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick item->readFromParcel(p); 7330e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL); 7340e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7350e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick // housekeeping 7360e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick delete item; 7370e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick item = NULL; 7380e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick 7390e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick return mybundle; 7400e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick} 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 742075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz) 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL ); 75271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getCurrentPosition: %d (msec)", msec); 753075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 756075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz) 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int msec; 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL ); 76671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("getDuration: %d (msec)", msec); 767075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) msec; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz) 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 77371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("reset"); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->reset(), NULL, NULL ); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 783075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype) 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 78571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAudioStreamType: %d", streamtype); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 791bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL ); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7941af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockstatic jint 7951af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockandroid_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz) 7961af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock{ 7971af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 7981af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock if (mp == NULL ) { 7991af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock jniThrowException(env, "java/lang/IllegalStateException", NULL); 8001af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return 0; 8011af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock } 8021af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock audio_stream_type_t streamtype; 8031af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL ); 8041af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock ALOGV("getAudioStreamType: %d (streamtype)", streamtype); 8051af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock return (jint) streamtype; 8061af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock} 8071af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock 8088df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivistatic jboolean 8098df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Triviandroid_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request) 8108df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi{ 8118df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi ALOGV("setParameter: key %d", key); 8128df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8138df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (mp == NULL ) { 8148df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi jniThrowException(env, "java/lang/IllegalStateException", NULL); 8158df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 8168df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 8178df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 8188df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi Parcel *request = parcelForJavaObject(env, java_request); 8198df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi status_t err = mp->setParameter(key, *request); 8208df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi if (err == OK) { 8218df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return true; 8228df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } else { 8238df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi return false; 8248df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi } 8258df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi} 8268df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping) 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 83071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setLooping: %d", looping); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL ); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz) 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 84271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("isLooping"); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 846075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 848075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return mp->isLooping() ? JNI_TRUE : JNI_FALSE; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 852075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume) 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 854075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL ) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", NULL); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 860075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL ); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 86320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// Sends the request and reply parcels to the media player via the 86420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// binder interface. 86520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniastatic jint 86620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, 86720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jobject java_request, jobject java_reply) 86820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania{ 86920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 87020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania if (media_player == NULL ) { 87120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 872b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 87320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania } 87420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 87520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *request = parcelForJavaObject(env, java_request); 87620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania Parcel *reply = parcelForJavaObject(env, java_reply); 87720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 87820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // Don't use process_media_player_call which use the async loop to 87920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania // report errors, instead returns the status. 880075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->invoke(*request, reply); 88120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania} 88220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania 883b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania// Sends the new filter to the client. 884b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniastatic jint 885b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniaandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request) 886b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania{ 887b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 888b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania if (media_player == NULL ) { 889b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 890b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania return UNKNOWN_ERROR; 891b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania } 892b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 893b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania Parcel *filter = parcelForJavaObject(env, request); 894b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 8955d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (filter == NULL ) { 8965d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Filter is null"); 8975d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania return UNKNOWN_ERROR; 8985d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 8995d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 900075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) media_player->setMetadataFilter(*filter); 901b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania} 902b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 9035d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniastatic jboolean 9045d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniaandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only, 9055d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jboolean apply_filter, jobject reply) 9065d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania{ 9075d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); 9085d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (media_player == NULL ) { 9095d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/IllegalStateException", NULL); 910075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 9115d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 9125d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9135d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania Parcel *metadata = parcelForJavaObject(env, reply); 9145d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9155d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania if (metadata == NULL ) { 9165d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null"); 917075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 9185d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania } 9195d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9205d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania metadata->freeData(); 9215d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // On return metadata is positioned at the beginning of the 9225d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // metadata. Note however that the parcel actually starts with the 9235d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // return code so you should not rewind the parcel using 9245d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania // setDataPosition(0). 925075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) { 926075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 927075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } else { 928075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 929075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat } 9305d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania} 9315d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania 9324935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function gets some field IDs, which in turn causes class initialization. 9334935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// It is called from a static block in MediaPlayer, which won't run until the 9344935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// first time an instance of this class is used. 9354935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenstatic void 9364935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenandroid_media_MediaPlayer_native_init(JNIEnv *env) 9374935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen{ 9384935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen jclass clazz; 9394935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 9404935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen clazz = env->FindClass("android/media/MediaPlayer"); 9414935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (clazz == NULL) { 9424935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 9434935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 9444935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 945075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); 9464935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.context == NULL) { 9474935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 9484935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 9494935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 9504935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative", 9514935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen "(Ljava/lang/Object;IIILjava/lang/Object;)V"); 9524935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen if (fields.post_event == NULL) { 9534935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen return; 9544935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen } 9554935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen 956075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J"); 9571ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg if (fields.surface_texture == NULL) { 958cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return; 959cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 960d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 961b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar env->DeleteLocalRef(clazz); 962b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 9635ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun clazz = env->FindClass("android/net/ProxyInfo"); 964d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber if (clazz == NULL) { 965d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber return; 966d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber } 967d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 968d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetHost = 969d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;"); 970d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 971d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetPort = 972d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber env->GetMethodID(clazz, "getPort", "()I"); 973d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber 974d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber fields.proxyConfigGetExclusionList = 9755ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;"); 976b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 977b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar env->DeleteLocalRef(clazz); 978b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar 97923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia gBufferingParamsFields.init(env); 9800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 9810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania // Modular DRM 9820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania FIND_CLASS(clazz, "android/media/MediaDrm$MediaDrmStateException"); 9830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (clazz) { 98406b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania GET_METHOD_ID(gStateExceptionFields.init, clazz, "<init>", "(ILjava/lang/String;)V"); 98506b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania gStateExceptionFields.classId = static_cast<jclass>(env->NewGlobalRef(clazz)); 9860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 9870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->DeleteLocalRef(clazz); 9880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else { 98906b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania ALOGE("JNI android_media_MediaPlayer_native_init couldn't " 9900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "get clazz android/media/MediaDrm$MediaDrmStateException"); 9910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 9920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 9932d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia gPlaybackParamsFields.init(env); 9942d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia gSyncParamsFields.init(env); 995035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung gVolumeShaperFields.init(env); 9964935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen} 997b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 100171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_setup"); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = new MediaPlayer(); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp == NULL) { 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create new listener and give it to MediaPlayer 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(listener); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Stow our new C++ MediaPlayer in an opaque field in the Java object. 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaPlayer(env, thiz, mp); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz) 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 101971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("release"); 1020d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang decVideoSurfaceRef(env, thiz); 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mp != NULL) { 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this prevents native callbacks after the object is released 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->setListener(0); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mp->disconnect(); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz) 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 103271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("native_finalize"); 10338dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 10348dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen if (mp != NULL) { 10358564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("MediaPlayer finalized without being released"); 10368dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_media_MediaPlayer_release(env, thiz); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104033b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kastenstatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env, jobject thiz, 104133b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten jint sessionId) { 104271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("set_session_id(): %d", sessionId); 1043619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1044619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 1045619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 1046619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return; 1047619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 104833b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten process_media_player_call( env, thiz, mp->setAudioSessionId((audio_session_t) sessionId), NULL, 104933b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten NULL); 1050619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 1051619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 1052619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env, jobject thiz) { 105371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("get_session_id()"); 1054619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1055619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent if (mp == NULL ) { 1056619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 1057619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent return 0; 1058619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent } 1059619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 1060075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) mp->getAudioSessionId(); 1061619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent} 1062619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent 10637070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void 10647070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level) 10657070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{ 106671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("setAuxEffectSendLevel: level %f", level); 10677070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 10687070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 10697070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 10707070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 10717070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 10727070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL ); 10737070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 10747070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 10757070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env, jobject thiz, jint effectId) { 107671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("attachAuxEffect(): %d", effectId); 10777070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 10787070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent if (mp == NULL ) { 10797070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent jniThrowException(env, "java/lang/IllegalStateException", NULL); 10807070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent return; 10817070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent } 10827070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL ); 10837070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent} 10847070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent 1085d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wangstatic jint 1086d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberandroid_media_MediaPlayer_pullBatteryData( 1087d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber JNIEnv *env, jobject /* thiz */, jobject java_reply) 1088d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang{ 1089d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player")); 1090d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder); 1091d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang if (service.get() == NULL) { 1092d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService"); 1093d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang return UNKNOWN_ERROR; 1094d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang } 1095d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 1096d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang Parcel *reply = parcelForJavaObject(env, java_reply); 1097d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 1098075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) service->pullBatteryData(reply); 1099d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang} 1100d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang 1101720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanstatic jint 1102720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanandroid_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz, 1103720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jstring addrString, jint port) { 1104720aa282791ef9405d39a15f419a41ab24f11e30John Grossman sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1105720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (mp == NULL ) { 1106720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 1107720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return INVALID_OPERATION; 1108720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1109720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1110720aa282791ef9405d39a15f419a41ab24f11e30John Grossman const char *cAddrString = NULL; 1111720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1112720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 1113720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString = env->GetStringUTFChars(addrString, NULL); 1114720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString == NULL) { // Out of memory 1115720aa282791ef9405d39a15f419a41ab24f11e30John Grossman return NO_MEMORY; 1116720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1117720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1118720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ALOGV("setRetransmitEndpoint: %s:%d", 1119720aa282791ef9405d39a15f419a41ab24f11e30John Grossman cAddrString ? cAddrString : "(null)", port); 1120720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1121720aa282791ef9405d39a15f419a41ab24f11e30John Grossman status_t ret; 1122720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (cAddrString && (port > 0xFFFF)) { 1123720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = BAD_VALUE; 1124720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } else { 1125720aa282791ef9405d39a15f419a41ab24f11e30John Grossman ret = mp->setRetransmitEndpoint(cAddrString, 1126720aa282791ef9405d39a15f419a41ab24f11e30John Grossman static_cast<uint16_t>(port)); 1127720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1128720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1129720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (NULL != addrString) { 1130720aa282791ef9405d39a15f419a41ab24f11e30John Grossman env->ReleaseStringUTFChars(addrString, cAddrString); 1131720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1132720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1133720aa282791ef9405d39a15f419a41ab24f11e30John Grossman if (ret == INVALID_OPERATION ) { 1134720aa282791ef9405d39a15f419a41ab24f11e30John Grossman jniThrowException(env, "java/lang/IllegalStateException", NULL); 1135720aa282791ef9405d39a15f419a41ab24f11e30John Grossman } 1136720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 1137075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) ret; 1138720aa282791ef9405d39a15f419a41ab24f11e30John Grossman} 1139720aa282791ef9405d39a15f419a41ab24f11e30John Grossman 114084b832054552e00257bb04997143ca33d6d100beMarco Nelissenstatic void 114184b832054552e00257bb04997143ca33d6d100beMarco Nelissenandroid_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player) 114284b832054552e00257bb04997143ca33d6d100beMarco Nelissen{ 114384b832054552e00257bb04997143ca33d6d100beMarco Nelissen ALOGV("setNextMediaPlayer"); 114484b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz); 114584b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (thisplayer == NULL) { 114684b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized"); 114784b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 114884b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 114984b832054552e00257bb04997143ca33d6d100beMarco Nelissen sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player); 115084b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == NULL && java_player != NULL) { 115184b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized"); 115284b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 115384b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 115484b832054552e00257bb04997143ca33d6d100beMarco Nelissen 115584b832054552e00257bb04997143ca33d6d100beMarco Nelissen if (nextplayer == thisplayer) { 115684b832054552e00257bb04997143ca33d6d100beMarco Nelissen jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self"); 115784b832054552e00257bb04997143ca33d6d100beMarco Nelissen return; 115884b832054552e00257bb04997143ca33d6d100beMarco Nelissen } 115984b832054552e00257bb04997143ca33d6d100beMarco Nelissen // tie the two players together 116084b832054552e00257bb04997143ca33d6d100beMarco Nelissen process_media_player_call( 116184b832054552e00257bb04997143ca33d6d100beMarco Nelissen env, thiz, thisplayer->setNextMediaPlayer(nextplayer), 116284b832054552e00257bb04997143ca33d6d100beMarco Nelissen "java/lang/IllegalArgumentException", 116384b832054552e00257bb04997143ca33d6d100beMarco Nelissen "setNextMediaPlayer failed." ); 116484b832054552e00257bb04997143ca33d6d100beMarco Nelissen ; 116584b832054552e00257bb04997143ca33d6d100beMarco Nelissen} 116684b832054552e00257bb04997143ca33d6d100beMarco Nelissen 1167035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung// Pass through the arguments to the MediaServer player implementation. 1168035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic jint android_media_MediaPlayer_applyVolumeShaper(JNIEnv *env, jobject thiz, 1169035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung jobject jconfig, jobject joperation) { 1170035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung // NOTE: hard code here to prevent platform issues. Must match VolumeShaper.java 1171035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung const int VOLUME_SHAPER_INVALID_OPERATION = -38; 1172035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1173035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1174035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (mp == nullptr) { 1175035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jint)VOLUME_SHAPER_INVALID_OPERATION; 1176035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1177035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1178035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<VolumeShaper::Configuration> configuration; 1179035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<VolumeShaper::Operation> operation; 1180035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (jconfig != nullptr) { 1181035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung configuration = VolumeShaperHelper::convertJobjectToConfiguration( 1182035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung env, gVolumeShaperFields, jconfig); 1183035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung ALOGV("applyVolumeShaper configuration: %s", configuration->toString().c_str()); 1184035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1185035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (joperation != nullptr) { 1186035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung operation = VolumeShaperHelper::convertJobjectToOperation( 1187035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung env, gVolumeShaperFields, joperation); 1188035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung ALOGV("applyVolumeShaper operation: %s", operation->toString().c_str()); 1189035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1190035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung VolumeShaper::Status status = mp->applyVolumeShaper(configuration, operation); 1191035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (status == INVALID_OPERATION) { 1192035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung status = VOLUME_SHAPER_INVALID_OPERATION; 1193035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1194035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jint)status; // if status < 0 an error, else a VolumeShaper id 1195035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung} 1196035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1197035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung// Pass through the arguments to the MediaServer player implementation. 1198035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic jobject android_media_MediaPlayer_getVolumeShaperState(JNIEnv *env, jobject thiz, 1199035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung jint id) { 1200035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 1201035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (mp == nullptr) { 1202035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jobject)nullptr; 1203035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1204035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 1205035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung sp<VolumeShaper::State> state = mp->getVolumeShaperState((int)id); 1206035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung if (state.get() == nullptr) { 1207035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return (jobject)nullptr; 1208035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung } 1209035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung return VolumeShaperHelper::convertStateToJobject(env, gVolumeShaperFields, state); 1210035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung} 1211035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung 12120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania///////////////////////////////////////////////////////////////////////////////////// 12130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM begin 12140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts 12160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void throwDrmStateException(JNIEnv *env, const char *msg, status_t err) 12170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 12180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania ALOGE("Illegal DRM state exception: %s (%d)", msg, err); 12190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 122006b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania jobject exception = env->NewObject(gStateExceptionFields.classId, 122106b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania gStateExceptionFields.init, static_cast<int>(err), 12220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->NewStringUTF(msg)); 12230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->Throw(static_cast<jthrowable>(exception)); 12240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 12250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts 12270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic bool throwDrmExceptionAsNecessary(JNIEnv *env, status_t err, const char *msg = NULL) 12280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 12290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania const char *drmMessage = "Unknown DRM Msg"; 12300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania switch (err) { 12320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_UNKNOWN: 12330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "General DRM error"; 12340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_NO_LICENSE: 12360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "No license"; 12370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_LICENSE_EXPIRED: 12390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "License expired"; 12400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_SESSION_NOT_OPENED: 12420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Session not opened"; 12430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED: 12450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Not initialized"; 12460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_DECRYPT: 12480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Decrypt error"; 12490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_CANNOT_HANDLE: 12510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Unsupported scheme or data format"; 12520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania case ERROR_DRM_TAMPER_DETECTED: 12540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = "Invalid state"; 12550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania default: 12570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania break; 12580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania String8 vendorMessage; 12610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err >= ERROR_DRM_VENDOR_MIN && err <= ERROR_DRM_VENDOR_MAX) { 12620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania vendorMessage = String8::format("DRM vendor-defined error: %d", err); 12630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania drmMessage = vendorMessage.string(); 12640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err == BAD_VALUE) { 12670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalArgumentException", msg); 12680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_NOT_PROVISIONED) { 12700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/NotProvisionedException", msg); 12710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_RESOURCE_BUSY) { 12730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/ResourceBusyException", msg); 12740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_DEVICE_REVOKED) { 12760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/DeniedByServerException", msg); 12770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == DEAD_OBJECT) { 12790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "android/media/MediaDrmResetException", 12800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "mediaserver died"); 12810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err != OK) { 12830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania String8 errbuf; 12840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (drmMessage != NULL) { 12850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (msg == NULL) { 12860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania msg = drmMessage; 12870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else { 12880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania errbuf = String8::format("%s: %s", msg, drmMessage); 12890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania msg = errbuf.string(); 12900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania throwDrmStateException(env, msg, err); 12930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return true; 12940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 12950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return false; 12960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 12970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 12980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic Vector<uint8_t> JByteArrayToVector(JNIEnv *env, jbyteArray const &byteArray) 12990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 13000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania Vector<uint8_t> vector; 13010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania size_t length = env->GetArrayLength(byteArray); 13020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania vector.insertAt((size_t)0, length); 13030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env->GetByteArrayRegion(byteArray, 0, length, (jbyte *)vector.editArray()); 13040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return vector; 13050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 13060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_prepareDrm(JNIEnv *env, jobject thiz, 130806b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania jbyteArray uuidObj, jbyteArray drmSessionIdObj) 13090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 13100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 13110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (mp == NULL) { 13120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalStateException", NULL); 13130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (uuidObj == NULL) { 13170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 13180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania Vector<uint8_t> uuid = JByteArrayToVector(env, uuidObj); 13220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (uuid.size() != 16) { 13240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "java/lang/IllegalArgumentException", 13270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "invalid UUID size, expected 16 bytes"); 13280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 133106b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania Vector<uint8_t> drmSessionId = JByteArrayToVector(env, drmSessionIdObj); 133206b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania 133306b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania if (drmSessionId.size() == 0) { 133406b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania jniThrowException( 133506b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania env, 133606b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "java/lang/IllegalArgumentException", 133706b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "empty drmSessionId"); 133806b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania return; 133906b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania } 134006b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania 134106b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania status_t err = mp->prepareDrm(uuid.array(), drmSessionId); 13420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err != OK) { 13430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err == INVALID_OPERATION) { 13440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "java/lang/IllegalStateException", 134706b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "The player must be in prepared state."); 13480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else if (err == ERROR_DRM_CANNOT_HANDLE) { 13490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "android/media/UnsupportedSchemeException", 13520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "Failed to instantiate drm object."); 13530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } else { 13540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania throwDrmExceptionAsNecessary(env, err, "Failed to prepare DRM scheme"); 13550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 13580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_releaseDrm(JNIEnv *env, jobject thiz) 13600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{ 13610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 13620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (mp == NULL ) { 13630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException(env, "java/lang/IllegalStateException", NULL); 13640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania return; 13650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania 13670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania status_t err = mp->releaseDrm(); 13680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err != OK) { 13690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania if (err == INVALID_OPERATION) { 13700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania jniThrowException( 13710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania env, 13720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania "java/lang/IllegalStateException", 137306b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania "Can not release DRM in an active player state."); 13740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania } 13760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania} 13770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM end 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13806e5a628ab6cb3554197ef88e050e22987adc16e1jiabin///////////////////////////////////////////////////////////////////////////////////// 13816e5a628ab6cb3554197ef88e050e22987adc16e1jiabin// AudioRouting begin 13826e5a628ab6cb3554197ef88e050e22987adc16e1jiabinstatic jboolean android_media_MediaPlayer_setOutputDevice(JNIEnv *env, jobject thiz, jint device_id) 13836e5a628ab6cb3554197ef88e050e22987adc16e1jiabin{ 13846e5a628ab6cb3554197ef88e050e22987adc16e1jiabin sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 13856e5a628ab6cb3554197ef88e050e22987adc16e1jiabin if (mp == NULL) { 13866e5a628ab6cb3554197ef88e050e22987adc16e1jiabin return false; 13876e5a628ab6cb3554197ef88e050e22987adc16e1jiabin } 13886e5a628ab6cb3554197ef88e050e22987adc16e1jiabin return mp->setOutputDevice(device_id) == NO_ERROR; 13896e5a628ab6cb3554197ef88e050e22987adc16e1jiabin} 13906e5a628ab6cb3554197ef88e050e22987adc16e1jiabin 13916e5a628ab6cb3554197ef88e050e22987adc16e1jiabinstatic jint android_media_MediaPlayer_getRoutedDeviceId(JNIEnv *env, jobject thiz) 13926e5a628ab6cb3554197ef88e050e22987adc16e1jiabin{ 13936e5a628ab6cb3554197ef88e050e22987adc16e1jiabin sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 13946e5a628ab6cb3554197ef88e050e22987adc16e1jiabin if (mp == NULL) { 13956e5a628ab6cb3554197ef88e050e22987adc16e1jiabin return AUDIO_PORT_HANDLE_NONE; 13966e5a628ab6cb3554197ef88e050e22987adc16e1jiabin } 13976e5a628ab6cb3554197ef88e050e22987adc16e1jiabin return mp->getRoutedDeviceId(); 13986e5a628ab6cb3554197ef88e050e22987adc16e1jiabin} 13996e5a628ab6cb3554197ef88e050e22987adc16e1jiabin 14006e5a628ab6cb3554197ef88e050e22987adc16e1jiabinstatic void android_media_MediaPlayer_enableDeviceCallback( 14016e5a628ab6cb3554197ef88e050e22987adc16e1jiabin JNIEnv* env, jobject thiz, jboolean enabled) 14026e5a628ab6cb3554197ef88e050e22987adc16e1jiabin{ 14036e5a628ab6cb3554197ef88e050e22987adc16e1jiabin sp<MediaPlayer> mp = getMediaPlayer(env, thiz); 14046e5a628ab6cb3554197ef88e050e22987adc16e1jiabin if (mp == NULL) { 14056e5a628ab6cb3554197ef88e050e22987adc16e1jiabin return; 14066e5a628ab6cb3554197ef88e050e22987adc16e1jiabin } 14076e5a628ab6cb3554197ef88e050e22987adc16e1jiabin 14086e5a628ab6cb3554197ef88e050e22987adc16e1jiabin status_t status = mp->enableAudioDeviceCallback(enabled); 14096e5a628ab6cb3554197ef88e050e22987adc16e1jiabin if (status != NO_ERROR) { 14106e5a628ab6cb3554197ef88e050e22987adc16e1jiabin jniThrowException(env, "java/lang/IllegalStateException", NULL); 14116e5a628ab6cb3554197ef88e050e22987adc16e1jiabin ALOGE("enable device callback failed: %d", status); 14126e5a628ab6cb3554197ef88e050e22987adc16e1jiabin } 14136e5a628ab6cb3554197ef88e050e22987adc16e1jiabin} 14146e5a628ab6cb3554197ef88e050e22987adc16e1jiabin 14156e5a628ab6cb3554197ef88e050e22987adc16e1jiabin// AudioRouting end 14166e5a628ab6cb3554197ef88e050e22987adc16e1jiabin// ---------------------------------------------------------------------------- 14176e5a628ab6cb3554197ef88e050e22987adc16e1jiabin 141876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 141917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong { 1420d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "nativeSetDataSource", 1421d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;" 1422d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "[Ljava/lang/String;)V", 142317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong (void *)android_media_MediaPlayer_setDataSourceAndHeaders 142417524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong }, 142517524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong 14264eaa2938084353a54dc259466172909329a048ccChris Watkins {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD}, 14274eaa2938084353a54dc259466172909329a048ccChris Watkins {"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback }, 14281ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface}, 142923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia {"getBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer_getBufferingParams}, 143023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia {"setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer_setBufferingParams}, 1431c42a96dba4beaf87875e71b8d8b77ce7154c5cdbRobert Shih {"_prepare", "()V", (void *)android_media_MediaPlayer_prepare}, 143207830aa6ba4804880df3cb39f8932aa6b3906a8aRobert Shih {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync}, 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_start", "()V", (void *)android_media_MediaPlayer_start}, 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_stop", "()V", (void *)android_media_MediaPlayer_stop}, 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth}, 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight}, 143710353e36018224b86ef2918d1d68107459d445cfRay Essick {"native_getMetrics", "()Landroid/os/PersistableBundle;", (void *)android_media_MediaPlayer_native_getMetrics}, 14382d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams}, 14392d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams}, 14402d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"setSyncParams", "(Landroid/media/SyncParams;)V", (void *)android_media_MediaPlayer_setSyncParams}, 14412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia {"getSyncParams", "()Landroid/media/SyncParams;", (void *)android_media_MediaPlayer_getSyncParams}, 1442bebeaf9ae3251e24a214951e6559cd40f15ef4fbWei Jia {"_seekTo", "(JI)V", (void *)android_media_MediaPlayer_seekTo}, 1443c02f09d0d13b1c5e12f5d60229986245936bfc97Wei Jia {"_notifyAt", "(J)V", (void *)android_media_MediaPlayer_notifyAt}, 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_pause", "()V", (void *)android_media_MediaPlayer_pause}, 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isPlaying", "()Z", (void *)android_media_MediaPlayer_isPlaying}, 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer_getCurrentPosition}, 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getDuration", "()I", (void *)android_media_MediaPlayer_getDuration}, 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_release", "()V", (void *)android_media_MediaPlayer_release}, 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"_reset", "()V", (void *)android_media_MediaPlayer_reset}, 14501af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAudioStreamType", "(I)V", (void *)android_media_MediaPlayer_setAudioStreamType}, 14511af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer_getAudioStreamType}, 14528df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi {"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_setParameter}, 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"setLooping", "(Z)V", (void *)android_media_MediaPlayer_setLooping}, 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isLooping", "()Z", (void *)android_media_MediaPlayer_isLooping}, 14551af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer_setVolume}, 145620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania {"native_invoke", "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke}, 1457b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania {"native_setMetadataFilter", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_setMetadataFilter}, 14585d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_getMetadata}, 14594935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen {"native_init", "()V", (void *)android_media_MediaPlayer_native_init}, 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer_native_setup}, 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize}, 1462619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"getAudioSessionId", "()I", (void *)android_media_MediaPlayer_get_audio_session_id}, 1463619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer_set_audio_session_id}, 14641af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer_setAuxEffectSendLevel}, 14657070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer_attachAuxEffect}, 1466d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang {"native_pullBatteryData", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_pullBatteryData}, 1467720aa282791ef9405d39a15f419a41ab24f11e30John Grossman {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer_setRetransmitEndpoint}, 146884b832054552e00257bb04997143ca33d6d100beMarco Nelissen {"setNextMediaPlayer", "(Landroid/media/MediaPlayer;)V", (void *)android_media_MediaPlayer_setNextMediaPlayer}, 1469035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung {"native_applyVolumeShaper", 1470035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung "(Landroid/media/VolumeShaper$Configuration;Landroid/media/VolumeShaper$Operation;)I", 1471035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung (void *)android_media_MediaPlayer_applyVolumeShaper}, 1472035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung {"native_getVolumeShaperState", 1473035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung "(I)Landroid/media/VolumeShaper$State;", 1474035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung (void *)android_media_MediaPlayer_getVolumeShaperState}, 14750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania // Modular DRM 147606b25fb2367d1962da5445d1c3c033c73a4b95ebHassan Shojania { "_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer_prepareDrm }, 14770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania { "_releaseDrm", "()V", (void *)android_media_MediaPlayer_releaseDrm }, 14786e5a628ab6cb3554197ef88e050e22987adc16e1jiabin 14796e5a628ab6cb3554197ef88e050e22987adc16e1jiabin // AudioRouting 14806e5a628ab6cb3554197ef88e050e22987adc16e1jiabin {"native_setOutputDevice", "(I)Z", (void *)android_media_MediaPlayer_setOutputDevice}, 14816e5a628ab6cb3554197ef88e050e22987adc16e1jiabin {"native_getRoutedDeviceId", "()I", (void *)android_media_MediaPlayer_getRoutedDeviceId}, 14826e5a628ab6cb3554197ef88e050e22987adc16e1jiabin {"native_enableDeviceCallback", "(Z)V", (void *)android_media_MediaPlayer_enableDeviceCallback}, 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14854935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function only registers the native methods 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int register_android_media_MediaPlayer(JNIEnv *env) 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/media/MediaPlayer", gMethods, NELEM(gMethods)); 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1491212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun Heextern int register_android_media_ImageReader(JNIEnv *env); 1492f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun Heextern int register_android_media_ImageWriter(JNIEnv *env); 14938240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberextern int register_android_media_Crypto(JNIEnv *env); 14948a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerextern int register_android_media_Drm(JNIEnv *env); 1495d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhangextern int register_android_media_Descrambler(JNIEnv *env); 149688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaCodec(JNIEnv *env); 149788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaExtractor(JNIEnv *env); 14985a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberextern int register_android_media_MediaCodecList(JNIEnv *env); 1499d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberextern int register_android_media_MediaHTTPConnection(JNIEnv *env); 1500bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_MediaMetadataRetriever(JNIEnv *env); 150168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiextern int register_android_media_MediaMuxer(JNIEnv *env); 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaRecorder(JNIEnv *env); 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaScanner(JNIEnv *env); 1504071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jiaextern int register_android_media_MediaSync(JNIEnv *env); 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_ResampleInputStream(JNIEnv *env); 1506c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongextern int register_android_media_MediaProfiles(JNIEnv *env); 15070cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpDatabase(JNIEnv *env); 15088182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodextern int register_android_mtp_MtpDevice(JNIEnv *env); 15090cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpServer(JNIEnv *env); 1510bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber 1511d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberjint JNI_OnLoad(JavaVM* vm, void* /* reserved */) 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = NULL; 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint result = -1; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { 15173762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: GetEnv failed\n"); 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(env != NULL); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1522f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He if (register_android_media_ImageWriter(env) != JNI_OK) { 1523f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He ALOGE("ERROR: ImageWriter native registration failed"); 1524f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He goto bail; 1525f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He } 1526f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He 1527212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He if (register_android_media_ImageReader(env) < 0) { 1528212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He ALOGE("ERROR: ImageReader native registration failed"); 1529212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He goto bail; 1530212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He } 1531212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaPlayer(env) < 0) { 15333762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaPlayer native registration failed\n"); 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaRecorder(env) < 0) { 15383762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaRecorder native registration failed\n"); 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaScanner(env) < 0) { 15433762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaScanner native registration failed\n"); 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_MediaMetadataRetriever(env) < 0) { 15483762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaMetadataRetriever native registration failed\n"); 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (register_android_media_ResampleInputStream(env) < 0) { 15533762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: ResampleInputStream native registration failed\n"); 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1557c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong if (register_android_media_MediaProfiles(env) < 0) { 15583762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MediaProfiles native registration failed"); 1559c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong goto bail; 1560c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong } 1561c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong 15620cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpDatabase(env) < 0) { 15633762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDatabase native registration failed"); 1564d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood goto bail; 1565d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood } 1566d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood 15678182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood if (register_android_mtp_MtpDevice(env) < 0) { 15683762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpDevice native registration failed"); 15698182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood goto bail; 15708182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood } 15718182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood 15720cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood if (register_android_mtp_MtpServer(env) < 0) { 15733762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("ERROR: MtpServer native registration failed"); 157481ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood goto bail; 157581ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood } 157681ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood 157788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaCodec(env) < 0) { 157888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 1579071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia goto bail; 1580071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia } 1581071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia 1582071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia if (register_android_media_MediaSync(env) < 0) { 1583071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia ALOGE("ERROR: MediaSync native registration failed"); 158488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 158588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 158688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 158788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (register_android_media_MediaExtractor(env) < 0) { 158888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 158988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber goto bail; 159088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 159188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 159268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui if (register_android_media_MediaMuxer(env) < 0) { 159368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui ALOGE("ERROR: MediaMuxer native registration failed"); 159468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui goto bail; 159568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui } 159668ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui 15975a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber if (register_android_media_MediaCodecList(env) < 0) { 15985a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 15995a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber goto bail; 16005a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber } 16015a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber 16028240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber if (register_android_media_Crypto(env) < 0) { 16038240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber ALOGE("ERROR: MediaCodec native registration failed"); 16048240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber goto bail; 16058240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber } 16068240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber 16078a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker if (register_android_media_Drm(env) < 0) { 16088a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker ALOGE("ERROR: MediaDrm native registration failed"); 16098a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker goto bail; 16108a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker } 16118a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker 1612d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang if (register_android_media_Descrambler(env) < 0) { 1613d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang ALOGE("ERROR: MediaDescrambler native registration failed"); 1614d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang goto bail; 1615d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang } 1616d5927ae8833780395f8fc5070d0a0a4f8f668292Chong Zhang 1617d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (register_android_media_MediaHTTPConnection(env) < 0) { 1618d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber ALOGE("ERROR: MediaHTTPConnection native registration failed"); 1619d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber goto bail; 1620d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 1621d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* success -- return valid version number */ 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project result = JNI_VERSION_1_4; 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// KTHXBYE 1630