Add setParameter/getParameter to MediaPlayer API.

for bug 1982947

Change-Id: If3f40e4f18cbba155af29944af38bdc627f8cd53
This commit is contained in:
Gloria Wang
2011-04-25 17:28:22 -07:00
parent 71a0dab1ca
commit d01ec6eab0
18 changed files with 245 additions and 0 deletions

View File

@@ -51,6 +51,8 @@ public:
virtual status_t setVolume(float leftVolume, float rightVolume) = 0;
virtual status_t setAuxEffectSendLevel(float level) = 0;
virtual status_t attachAuxEffect(int effectId) = 0;
virtual status_t setParameter(int key, const Parcel& request) = 0;
virtual status_t getParameter(int key, Parcel* reply) = 0;
// Invoke a generic method on the player by using opaque parcels
// for the request and reply.

View File

@@ -132,6 +132,8 @@ public:
virtual status_t reset() = 0;
virtual status_t setLooping(int loop) = 0;
virtual player_type playerType() = 0;
virtual status_t setParameter(int key, const Parcel &request) = 0;
virtual status_t getParameter(int key, Parcel *reply) = 0;
// Invoke a generic method on the player by using opaque parcels
// for the request and reply.

View File

@@ -177,6 +177,9 @@ public:
int getAudioSessionId();
status_t setAuxEffectSendLevel(float level);
status_t attachAuxEffect(int effectId);
status_t setParameter(int key, const Parcel& request);
status_t getParameter(int key, Parcel* reply);
private:
void clear_l();
status_t seekTo_l(int msec);

View File

@@ -1227,6 +1227,84 @@ public class MediaPlayer
*/
public native void attachAuxEffect(int effectId);
/**
* Sets the parameter indicated by key.
* @param key key indicates the parameter to be set.
* @param value value of the parameter to be set.
* @return true if the parameter is set successfully, false otherwise
* {@hide}
*/
public native boolean setParameter(int key, Parcel value);
/**
* Sets the parameter indicated by key.
* @param key key indicates the parameter to be set.
* @param value value of the parameter to be set.
* @return true if the parameter is set successfully, false otherwise
* {@hide}
*/
public boolean setParameter(int key, String value) {
Parcel p = Parcel.obtain();
p.writeString(value);
return setParameter(key, p);
}
/**
* Sets the parameter indicated by key.
* @param key key indicates the parameter to be set.
* @param value value of the parameter to be set.
* @return true if the parameter is set successfully, false otherwise
* {@hide}
*/
public boolean setParameter(int key, int value) {
Parcel p = Parcel.obtain();
p.writeInt(value);
return setParameter(key, p);
}
/**
* Gets the value of the parameter indicated by key.
* @param key key indicates the parameter to get.
* @param reply value of the parameter to get.
*/
private native void getParameter(int key, Parcel reply);
/**
* Gets the value of the parameter indicated by key.
* @param key key indicates the parameter to get.
* @return value of the parameter.
* {@hide}
*/
public Parcel getParcelParameter(int key) {
Parcel p = Parcel.obtain();
getParameter(key, p);
return p;
}
/**
* Gets the value of the parameter indicated by key.
* @param key key indicates the parameter to get.
* @return value of the parameter.
* {@hide}
*/
public String getStringParameter(int key) {
Parcel p = Parcel.obtain();
getParameter(key, p);
return p.readString();
}
/**
* Gets the value of the parameter indicated by key.
* @param key key indicates the parameter to get.
* @return value of the parameter.
* {@hide}
*/
public int getIntParameter(int key) {
Parcel p = Parcel.obtain();
getParameter(key, p);
return p.readInt();
}
/**
* Sets the send level of the player to the attached auxiliary effect
* {@see #attachAuxEffect(int)}. The level value range is 0 to 1.0.

View File

@@ -814,6 +814,39 @@ android_media_MediaPlayer_pullBatteryData(JNIEnv *env, jobject thiz, jobject jav
return service->pullBatteryData(reply);
}
static jboolean
android_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request)
{
LOGV("setParameter: key %d", key);
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
if (mp == NULL ) {
jniThrowException(env, "java/lang/IllegalStateException", NULL);
return false;
}
Parcel *request = parcelForJavaObject(env, java_request);
status_t err = mp->setParameter(key, *request);
if (err == OK) {
return true;
} else {
return false;
}
}
static void
android_media_MediaPlayer_getParameter(JNIEnv *env, jobject thiz, jint key, jobject java_reply)
{
LOGV("getParameter: key %d", key);
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
if (mp == NULL ) {
jniThrowException(env, "java/lang/IllegalStateException", NULL);
return;
}
Parcel *reply = parcelForJavaObject(env, java_reply);
process_media_player_call(env, thiz, mp->getParameter(key, reply), NULL, NULL );
}
// ----------------------------------------------------------------------------
static JNINativeMethod gMethods[] = {
@@ -850,6 +883,8 @@ static JNINativeMethod gMethods[] = {
{"setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer_setAuxEffectSendLevel},
{"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer_attachAuxEffect},
{"native_pullBatteryData", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_pullBatteryData},
{"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_setParameter},
{"getParameter", "(ILandroid/os/Parcel;)V", (void *)android_media_MediaPlayer_getParameter},
};
static const char* const kClassPathName = "android/media/MediaPlayer";

View File

@@ -48,6 +48,8 @@ enum {
SET_AUX_EFFECT_SEND_LEVEL,
ATTACH_AUX_EFFECT,
SET_VIDEO_SURFACETEXTURE,
SET_PARAMETER,
GET_PARAMETER,
};
class BpMediaPlayer: public BpInterface<IMediaPlayer>
@@ -236,6 +238,26 @@ public:
return reply.readInt32();
}
status_t setParameter(int key, const Parcel& request)
{
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
data.writeInt32(key);
if (request.dataSize() > 0) {
data.appendFrom(const_cast<Parcel *>(&request), 0, request.dataSize());
}
remote()->transact(SET_PARAMETER, data, &reply);
return reply.readInt32();
}
status_t getParameter(int key, Parcel *reply)
{
Parcel data;
data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
data.writeInt32(key);
return remote()->transact(GET_PARAMETER, data, reply);
}
};
IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer");
@@ -361,6 +383,23 @@ status_t BnMediaPlayer::onTransact(
reply->writeInt32(attachAuxEffect(data.readInt32()));
return NO_ERROR;
} break;
case SET_PARAMETER: {
CHECK_INTERFACE(IMediaPlayer, data, reply);
int key = data.readInt32();
Parcel request;
if (data.dataAvail() > 0) {
request.appendFrom(
const_cast<Parcel *>(&data), data.dataPosition(), data.dataAvail());
}
request.setDataPosition(0);
reply->writeInt32(setParameter(key, request));
return NO_ERROR;
} break;
case GET_PARAMETER: {
CHECK_INTERFACE(IMediaPlayer, data, reply);
return getParameter(data.readInt32(), reply);
} break;
default:
return BBinder::onTransact(code, data, reply, flags);
}

View File

@@ -553,6 +553,28 @@ status_t MediaPlayer::attachAuxEffect(int effectId)
return mPlayer->attachAuxEffect(effectId);
}
status_t MediaPlayer::setParameter(int key, const Parcel& request)
{
LOGV("MediaPlayer::setParameter(%d)", key);
Mutex::Autolock _l(mLock);
if (mPlayer != NULL) {
return mPlayer->setParameter(key, request);
}
LOGV("setParameter: no active player");
return INVALID_OPERATION;
}
status_t MediaPlayer::getParameter(int key, Parcel *reply)
{
LOGV("MediaPlayer::getParameter(%d)", key);
Mutex::Autolock _l(mLock);
if (mPlayer != NULL) {
return mPlayer->getParameter(key, reply);
}
LOGV("getParameter: no active player");
return INVALID_OPERATION;
}
void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
{
LOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);

View File

@@ -1024,6 +1024,20 @@ status_t MediaPlayerService::Client::attachAuxEffect(int effectId)
return NO_ERROR;
}
status_t MediaPlayerService::Client::setParameter(int key, const Parcel &request) {
LOGV("[%d] setParameter(%d)", mConnId, key);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
return p->setParameter(key, request);
}
status_t MediaPlayerService::Client::getParameter(int key, Parcel *reply) {
LOGV("[%d] getParameter(%d)", mConnId, key);
sp<MediaPlayerBase> p = getPlayer();
if (p == 0) return UNKNOWN_ERROR;
return p->getParameter(key, reply);
}
void MediaPlayerService::Client::notify(
void* cookie, int msg, int ext1, int ext2, const Parcel *obj)
{

View File

@@ -279,6 +279,8 @@ private:
Parcel *reply);
virtual status_t setAuxEffectSendLevel(float level);
virtual status_t attachAuxEffect(int effectId);
virtual status_t setParameter(int key, const Parcel &request);
virtual status_t getParameter(int key, Parcel *reply);
sp<MediaPlayerBase> createPlayer(player_type playerType);

View File

@@ -55,6 +55,13 @@ public:
virtual status_t invoke(const Parcel& request, Parcel *reply) {
return INVALID_OPERATION;
}
virtual status_t setParameter(int key, const Parcel &request) {
return INVALID_OPERATION;
}
virtual status_t getParameter(int key, Parcel *reply) {
return INVALID_OPERATION;
}
private:
status_t createOutputTrack();

View File

@@ -177,6 +177,16 @@ void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
mPlayer->setAudioSink(audioSink);
}
status_t StagefrightPlayer::setParameter(int key, const Parcel &request) {
LOGV("setParameter");
return mPlayer->setParameter(key, request);
}
status_t StagefrightPlayer::getParameter(int key, Parcel *reply) {
LOGV("getParameter");
return mPlayer->getParameter(key, reply);
}
status_t StagefrightPlayer::getMetadata(
const media::Metadata::Filter& ids, Parcel *records) {
using media::Metadata;

View File

@@ -55,6 +55,8 @@ public:
virtual player_type playerType();
virtual status_t invoke(const Parcel &request, Parcel *reply);
virtual void setAudioSink(const sp<AudioSink> &audioSink);
virtual status_t setParameter(int key, const Parcel &request);
virtual status_t getParameter(int key, Parcel *reply);
virtual status_t getMetadata(
const media::Metadata::Filter& ids, Parcel *records);

View File

@@ -99,6 +99,12 @@ class TestPlayerStub : public MediaPlayerInterface {
virtual status_t invoke(const android::Parcel& in, android::Parcel *out) {
return mPlayer->invoke(in, out);
}
virtual status_t setParameter(int key, const Parcel &request) {
return mPlayer->setParameter(key, request);
}
virtual status_t getParameter(int key, Parcel *reply) {
return mPlayer->getParameter(key, reply);
}
// @return true if the current build is 'eng' or 'test' and the

View File

@@ -246,6 +246,14 @@ void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
mPlayer->setAudioSink(audioSink);
}
status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
return INVALID_OPERATION;
}
status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
return INVALID_OPERATION;
}
status_t NuPlayerDriver::getMetadata(
const media::Metadata::Filter& ids, Parcel *records) {
return INVALID_OPERATION;

View File

@@ -52,6 +52,8 @@ struct NuPlayerDriver : public MediaPlayerInterface {
virtual player_type playerType();
virtual status_t invoke(const Parcel &request, Parcel *reply);
virtual void setAudioSink(const sp<AudioSink> &audioSink);
virtual status_t setParameter(int key, const Parcel &request);
virtual status_t getParameter(int key, Parcel *reply);
virtual status_t getMetadata(
const media::Metadata::Filter& ids, Parcel *records);

View File

@@ -1905,4 +1905,11 @@ void AwesomePlayer::postAudioSeekComplete() {
postCheckAudioStatusEvent_l(0 /* delayUs */);
}
status_t AwesomePlayer::setParameter(int key, const Parcel &request) {
return OK;
}
status_t AwesomePlayer::getParameter(int key, Parcel *reply) {
return OK;
}
} // namespace android

View File

@@ -88,6 +88,9 @@ struct AwesomePlayer {
status_t getDuration(int64_t *durationUs);
status_t getPosition(int64_t *positionUs);
status_t setParameter(int key, const Parcel &request);
status_t getParameter(int key, Parcel *reply);
status_t seekTo(int64_t timeUs);
// This is a mask of MediaExtractor::Flags.

View File

@@ -84,6 +84,9 @@ class Player: public MediaPlayerBase
virtual status_t setLooping(int loop) {return OK;}
virtual player_type playerType() {return TEST_PLAYER;}
virtual status_t invoke(const Parcel& request, Parcel *reply);
virtual status_t setParameter(int key, const Parcel &request) {return OK;}
virtual status_t getParameter(int key, Parcel *reply) {return OK;}
private:
// Take a request, copy it to the reply.