MediaPlayer.cpp中mplayer是bp还是bn端呢?

21 篇文章 0 订阅

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);
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值