Android7.1 NuPlayer架构流程(未完...)

MediaPlayer基本使用方式:播放一首MP3歌曲
MediaPlayer mp = new MediaPlayer();
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();
mp.start();//这里初始化CCDeCoder解码器


1. IMediaPlayer.cpp/h
<1>.头文件
frameworks/av/include/media/IMediaPlayer.h
#include <utils/RefBase.h> 
#include <binder/IInterface.h> 
#include <binder/Parcel.h>

class IMediaPlayer: public IInterface{
public:
  //使用宏,申明MediaPlayer ——> IMediaPlayer
  DECLARE_META_INTERFACE(MediaPlayer);

  //声明setDataSource()纯虚方法
  virtual status_t  setDataSource(const sp<IDataSource>& source) = 0;
  virtual status_t  setDataSource(const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8>* headers) = 0;
  virtual status_t  setDataSource(int fd, int64_t offset, int64_t length) = 0; 
  virtual status_t  setDataSource(const sp<IStreamSource>& source) = 0;
};

//声明一下服务端BnMediaPlayer
class BnMediaPlayer: public BnInterface<IMediaPlayer>{
  public:
      virtual status_t  onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
}

<2>.源文件
frameworks/av/media/libmedia/IMediaPlayer.cpp

class BpMediaPlayer: public BpInterface<IMediaPlayer>{

public:
 //BpMediaPlayer代理客户端初始化
 BpMediaPlayer(const sp<IBinder>& impl) : BpInterface<IMediaPlayer>(impl){
 
 } 

 //实现客户端setDataSource方法
 status_t setDataSource(const sp<IStreamSource> &source) {
  Parcel data, reply;
  data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
  data.writeStrongBinder(IInterface::asBinder(source)); 

  //发送SET_DATA_SOURCE_STREAM命令在Bn端远程调用setDataSource()方法
  remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);

  //客户端通过reply.readInt32()方法返回Bn远程端返回的数据,返回给java应用层使用
  return reply.readInt32();
 }
 
 //利用Binder引用远程调用setDataSource()方法
 IMPLEMENT_META_INTERFACE(MediaPlayer, "android.media.IMediaPlayer”);

扫描二维码关注公众号,回复: 2559829 查看本文章

 //服务端,接收远程消息,处理onTransact方法
 status_t BnMediaPlayer::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
  switch (code) {
        //收到SET_DATA_SOURCE_STREAM命令的处理流程
    case SET_DATA_SOURCE_STREAM:{
             CHECK_INTERFACE(IMediaPlayer, data, reply);
             sp<IStreamSource> source = interface_cast<IStreamSource>(data.readStrongBinder());
             if (source == NULL) {
            reply->writeInt32(BAD_VALUE);
         }else {
                //调用BN服务端实现的setDataSource()方法,然后通过reply->writeInt32(setDataSource(source))返回给客户端
                reply->writeInt32(setDataSource(source));
         }
    return NO_ERROR;
    }
 }

}
}

2. MediaPlayerService.cpp/h
<1>.头文件
frameworks/av/media/libmediaplayerservice/MediaPlayerService.h
#include <media/MediaPlayerInterface.h> 
class MediaPlayerService : public BnMediaPlayerService{
  private:
         //因为Client类继承了BnMediaPlayer远程的服务端
         class Client : public BnMediaPlayer {
           //BnMediaPlayer端的setDataSource()方法实现在这里
       virtual status_t  setDataSource(const sp<IStreamSource> &source);
  };

};

<2>.源文件
frameworks/av/media/libmediaplayerservice/MediaPlayerService.cpp
第一:
MediaPlayerService::Client::Client(const sp<MediaPlayerService>& service, pid_t pid, int32_t connId, 
                                   const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId, uid_t uid){
    //Client类初始化    
}
第二:
//Bn服务端执行的setDataSource()方法:这里就是Client类继承了BnMediaPlayer远程的服务端真正执行
status_t MediaPlayerService::Client::setDataSource(const sp<IStreamSource> &source) {
   player_type playerType = MediaPlayerFactory::getPlayerType(this, source);
   sp<MediaPlayerBase> p = setDataSource_pre(playerType);
   if(p == NULL) {
      return NO_INIT;
    }

   // now set data source
   //这里的setDataSource()最终调用第七步NuPlayerDriver.cpp中的status_t NuPlayerDriver::setDataSource()
   setDataSource_post(p, p->setDataSource(source));
   return mStatus;    
}
NuPlayerDriver.cpp
 ————>setDataSource(){mPlayer->setDataSourceAsync(httpService, url, headers);}
NuPlayer.cpp
   —————> setDataSourceAsync(){
          //发送命令kWhatSetDataSource和返回命令kWhatSourceNotify消息命令
          sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
          sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
          msg->setObject("source", new StreamingSource(notify, source));
          msg->post();
         }
      —————>onMessageReceive(){
              switch (msg->what()) {
           case kWhatSetDataSource:{
             status_t err = OK;//OK = 0;
             sp<RefBase> obj;
             mSource = static_cast<Source *>(obj.get());
              //把弱指针提升为强指针:定义在:NuPlayer.h: wp<NuPlayerDriver> mDriver;
                  sp<NuPlayerDriver> driver = mDriver.promote();
             if (driver != NULL)
            driver->notifySetDataSourceCompleted(err);
              }
            }
          }
    ————————->frameworks/av/media/libmediaplayerservice/nuplayer/StreamingSource.cpp
         NuPlayer::StreamingSource::StreamingSource(const sp<AMessage> &notify, const sp<IStreamSource> &source): Source(notify), mSource(source{    
           }
           ————————>void NuPlayer::StreamingSource::start(){
          mStreamListener = new NuPlayerStreamListener(mSource, NULL);
          mTSParser = new ATSParser(parserFlags); 
              mStreamListener->start();
              postReadBuffer();          
        }
        ——————————>status_t NuPlayer::StreamingSource::postReadBuffer() {
                (new AMessage(kWhatReadBuffer, this))->post();//发送kWhatReadBuffer命令
               }
           ———————>void NuPlayer::StreamingSource::onMessageReceived(){
                  case kWhatReadBuffer:
                   onReadBuffer();
               }
            ———————>void NuPlayer::StreamingSource::onReadBuffer() {
                for (int32_t i = 0; i < kNumListenerQueuePackets; ++i) { //for循环不停的读数据
                    ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra);
                    status_t err = mTSParser->feedTSPacket(buffer, sizeof(buffer)); 
                                 }
                   }
               —————————>frameworks/av/media/libstagefright/mpeg2ts/ATSParser.cpp
                     status_t ATSParser::feedTSPacket(){
                     ABitReader br((const uint8_t *)data, kTSPacketSize);
                             return parseTS(&br, event);
                                 }
        


第三:
sp<MediaPlayerBase> MediaPlayerService::Client::setDataSource_pre(player_type playerType){
   sp<MediaPlayerBase> p = createPlayer(playerType);
    if(p == NULL) 
      return p;
}

第四:
sp<MediaPlayerBase> MediaPlayerService::Client::createPlayer(player_type playerType){
  sp<MediaPlayerBase> p = getPlayer();
  if ((p != NULL) && (p->playerType() != playerType)) {
    p.clear(); 
  }

  if (p == NULL) {
    p = MediaPlayerFactory::createPlayer(playerType, this, notify, mPid);
  }

  return p;
}

第五:
frameworks/av/media/libmediaplayerservice/MediaPlayerFactory.cpp
#include "nuplayer/NuPlayerDriver.h" 
sp<MediaPlayerBase> MediaPlayerFactory::createPlayer(player_type playerType, void* cookie, notify_callback_f notifyFunc,  pid_t pid) {
  sp<MediaPlayerBase> p;
  factory = sFactoryMap.valueFor(playerType);
  p = factory->createPlayer(pid);
  if (p == NULL) {
    return p;
  }
}

第六:
class NuPlayerFactory : public MediaPlayerFactory::IFactory { 
  public:
       virtual sp<MediaPlayerBase> createPlayer(pid_t pid) { 
         ALOGV(" create NuPlayer");
         //在NuPlayerDriver实现创建播放器方法createPlayer()
         return new NuPlayerDriver(pid);
     }
};

第七:
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
NuPlayerDriver::NuPlayerDriver(pid_t pid) : mState(STATE_IDLE), mIsAsyncPrepare(false), mAsyncResult(UNKNOWN_ERROR), mSetSurfaceInProgress(false), ….){
  ALOGV("NuPlayerDriver(%p)", this);
  mLooper->setName("NuPlayerDriver Looper");
  mLooper->start(false, /* runOnCallingThread */ true,  /* canCallJava */  PRIORITY_AUDIO); 
  //在这里创建播放器
  mPlayer = AVNuFactory::get()->createNuPlayer(pid);
  mLooper->registerHandler(mPlayer);
  mPlayer->setDriver(this);

第八:
frameworks/av/media/libavextensions/mediaplayerservice/AVNuFactory.cpp
sp<NuPlayer> AVNuFactory::createNuPlayer(pid_t pid) {
   return new NuPlayer(pid);

第九:
frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
NuPlayer::NuPlayer(pid_t pid) : mUIDValid(false), mPID(pid), mPausedForBuffering(false) {
    clearFlushComplete(); 
}

3.mediaplayer.cpp/h
<1>.头文件
frameworks/av/include/media/mediaplayer.h
#include <media/IMediaPlayerClient.h>
#include <media/IMediaPlayer.h>
#include <media/IMediaDeathNotifier.h>

class MediaPlayer : public BnMediaPlayerClient, public virtual IMediaDeathNotifier{
public:
  MediaPlayer();
  ~MediaPlayer();

  virtual   status_t setDataSource(const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers);
  status_t  setDataSource(int fd, int64_t offset, int64_t length);
  status_t  setDataSource(const sp<IDataSource> &source);


};

<2>.源文件
frameworks/av/media/libmedia/mediaplayer.cpp
status_t MediaPlayer::setDataSource(const sp<IDataSource> &source){
  ALOGV("setDataSource(IDataSource)");
  status_t err = UNKNOWN_ERROR;
  const sp<IMediaPlayerService> service(getMediaPlayerService()); 
  if(service != 0) {
    sp<IMediaPlayer> player(service->create(this, mAudioSessionId));
     if((NO_ERROR != doSetRetransmitEndpoint(player)) || (NO_ERROR != player->setDataSource(source))) {
        player.clear();
    }
    err = attachNewPlayer(player)
  }
  return err;
}


4. IMediaPlayerService.cpp/h
<1>.头文件
frameworks/av/include/media/IMediaPlayerService.h
#include <utils/RefBase.h>
#include <binder/IInterface.h>
#include <binder/Parcel.h>
#include <media/IMediaPlayerClient.h>
#include <media/IMediaPlayer.h>

class IMediaPlayerService: public IInterface{
public:
  DECLARE_META_INTERFACE(MediaPlayerService);//使用宏,申明MediaPlayer ——> IMediaPlayer
  virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE) = 0;

};

<2>.源文件
frameworks/av/media/libmedia/IMediaPlayerService.cpp
 virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId){
  Parcel data, reply;
  data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); 
  data.writeStrongBinder(IInterface::asBinder(client));
  data.writeInt32(audioSessionId);
  remote()->transact(CREATE, data, &reply);
  return interface_cast<IMediaPlayer>(reply.readStrongBinder());
}

猜你喜欢

转载自blog.csdn.net/u010164190/article/details/81391567