这里用到了ibinder机制。mPlayer 是在 MediaPlayerService调用create创建的sp<IMediaPlayer> MediaPlayerService::create返回值 是 sp<Client>
 
你应该查看 MediaPlayerService里面的 Client类。通过查看代码可知status_t MediaPlayerService::Client::setVolume(float leftVolume, float rightVolume)
{
    LOGV("[%d] setVolume(%f, %f)", mConnId, leftVolume, rightVolume);
    // TODO: for hardware output, call player instead
    Mutex::Autolock l(mLock);
    if (mAudioOutput != 0) mAudioOutput->setVolume(leftVolume, rightVolume);
    return NO_ERROR;
}调用 mAudioOutput服务的api

解决方案 »

  1.   

    你错误的把mPlayer 理解为各种解码类。
    在客户端MediaPlayer里面,mPlayer只相当于一个播放的接口,不用具体的解码类,
    它对应MediaPlayerService里的client类。然后client里才具体去创建createPlayer,对应你的AwesomePlayer
      

  2.   

    看来还是源于我对C++的生疏,那我就再问一下sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));跟踪service->create(getpid(), this, mAudioSessionId)sp<Client> c = new Client(
                this, pid, connId, client, audioSessionId,
                IPCThreadState::self()->getCallingUid());player指向的是mediaPlayerService::Client对象,但定义的player类型是sp<IMediaPlayer>,那player到底是哪种类型,真是晕了
      

  3.   

    也在学习android中framework层的media库,继续关注中
      

  4.   

    看来还是源于我对C++的生疏,那我就再问一下sp<IMediaPlayer> player(service->create(getpid(), this, mAudioSessionId));跟踪service->create(getpid(), this, mAudioSessionId)sp<Client> c = new Client(
                this, pid, connId, client, audioSessionId,
                IPCThreadState::self()->getCallingUid());player指向的是mediaPlayerService::Client对象,但定义的player类型是sp<IMediaPlayer>,那player到底是哪种类型,真是晕了是个强指针