Merge "Add setParameter/getParameter to MediaPlayer API. for bug 1982947"
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user