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