MediaPlayer里面调用了setDataSource 通过这个函数,创建了mplayer播放器。一直有个疑问,这个mplayer是个bp端还是bn端呢?
status_t MediaPlayer::setDataSource(
const char *url, const KeyedVector<String8, String8> *headers)
{
LOGV("setDataSource(%s)", url);
status_t err = BAD_VALUE;
if (url != NULL) {
const sp<IMediaPlayerService>& service(getMediaPlayerService());
if (service != 0) {
sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId)); this指的是MediaPlayer对象。
if (NO_ERROR != player->setDataSource(url, headers)) {
player.clear();
}
err = attachNewPlayer(player);
}
}
return err;
}
查看这个源码。这里我们知道service获得到的是一个Bp端的,也就是BpMediaPlayerService。
我们看看BpMediaPlayerService的create函数。
virtual sp<IMediaPlayer> create(
pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId) {
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
data.writeInt32(pid);
data.writeStrongBinder(client->asBinder());这里的client是MediaPlayer,是一个BnMediaPlayerClient对象。
data.writeInt32(audioSessionId);
remote()->transact(CREATE, data, &reply);
return interface_cast<IMediaPlayer>(reply.readStrongBinder());
}
这里返回值做了一下interface_cast<IMediaPlayer>,我们知道这个函数就是创建一个BpBinder的,并转换成BpMediaPlayer。
所以这里可以肯定,mplayer是一个Bp端的。
看BnMediaPlayerService 中的实现。
status_t BnMediaPlayerService::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) {
case CREATE: {
CHECK_INTERFACE(IMediaPlayerService, data, reply);
pid_t pid = data.readInt32();
sp<IMediaPlayerClient> client =
interface_cast<IMediaPlayerClient>(data.readStrongBinder()); 这里是把MediaPlayer 转成一个BpMediaPlayerClient对象,因为实现在MediaPlayer.cpp里面。
int audioSessionId = data.readInt32();
sp<IMediaPlayer> player = create(pid, client, audioSessionId); BnMediaPlayer是这里创建的。并把这个BnMediaPlayer作为一个Binder返回给调用端。
reply->writeStrongBinder(player->asBinder());
return NO_ERROR;
} break;
****
default:
return BBinder::onTransact(code, data, reply, flags);
}
}