播放流程和dotaSourcce分析
Nuplayer.cpp中包含了mediaPlayer的SetDataSource,prepare和Start是真正核心的调用类。
NuPlayer::setDataSourceAsync()函数被重载,分别传入url 和 文件 ,创建Source通过
->new GenericSource 返回 source,并且 prepare 和 start 都是source来调用。
-> new AMessage 对象,将类Source 加入,提供给其他的线程调用,播放和setDataSource应该不是同线程
->msg->setObject("source", source);
->NuPlayer::prepareAsync() 还是通过mesg发送一个kWhatPrepare 的消息,
->NuPlayer::onMessageReceived(const sp&msg)在这边接受消息判断
->mSource->prepareAsync(); 这里看到调用了 Source的 方法。
GenericSource.cpp 也就是Source类
->case kWhatPrepareAsync: onPrepareAsync(); 在这里还是通过msg来调用本身的 onPrepareAsync(), 不清楚为什么Android在这经常使用AMessage来接受发送的消息,根据消息来执行函数,可能也是进程间一种通信的方法吧。
->再prepare阶段调用了 CreateFromURI()和new FileSource()根据函数名也看出创建了dataSource的两种方法,说明装载文件的真正阶段再 prepare阶段。
->// init extrator from data source err = initFromDataSource(); 在这里初始化了extractor
-> NuPlayer::GenericSource::initFromDataSource() 根据 类型分别初始化了 mAudioTrack 和 mVedioTrack() 这两个类还没分析
->NuPlayer::start() 还是通过消息机制来调用真正的业务函数 onStart();
->onStart()
-> instantiateDecoder(true, &mAudioDecoder); 初始化了 audio解码器。
->mSource->start(); 还是调用的Source的方法
-> NuPlayer::GenericSource::start()
->mAudioTrack.mSource->start() 在这里通过准备阶段初始化的 mVedioTrack来start。
->postReadBuffer(MEDIA_TRACK_TYPE_AUDIO); 读 解码器 解析的流实现
再往下到codec和codec driver。
问题:从service到 NuPlayer的连接还没找到,还不清楚调用方式。