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