1)切入点:根据最上层java调用的三条核心语句作为分析的切入点;
Java代码:
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(URI);//设置数据源
mp.prepare();//准备工作
mp.start();//开始播放
所以我关注了AwesomePlayer的有关setDataSource,prepare,start的操作.
2)指导思想:把握数据流和控制流,理清条理脉络;
3)设置数据源setDataSource();
android_media_MediaPlayer_setDataSource(JNI)è
MediaPlayer::setDataSource(),通过binder获取MediaPlayerService::Client(BpMediaPlayer)对象,在服务端保存在MediaPlayerService::mClients列表中,在客户端保存为MediaPlayer::mPlayer,MediaPlayer也保存为Client的mClient中,用于notify
-->Client::setDataSource()
--->getPlayerType(URI)根据URI来确定playerType
--->createPlayer(playerType),根据playerType创建播放器player并保存在MediaPlayerService::Client::mplayer中,在这里StageFrightPlayer创建,在其构造函数中AwesomPlayer随之也被创建,并保存在StageFrightPlayer::mPlayer
---> Client::mAudioOutput = new AudioOutput(),AudioOutput为AudioSink的子类,从而AudioSink被创建,并保存在Client::mAudioOutput
--->setAudioSink(mAudioOutput)并保在最终保存在ioSinkrayer::mplayer()通过自己存在AweSomePlayer::mAudioSink
---> StageFrightPlayer::setDataSource(url, headers);
---->AweSomePlayer::setDataSource_l()设置mUri为传入的uri
综上所述:setDataSource一路下来,创建客户端代理BpMediaPlayer(Client是BnMediaPlayer),然后通过代理到Client中创建播放器StageFrightPlayer,实质是AweSomePlayer,在此过程中AudioSink被创建,并传递给AwesomePlayer,最终设置mUri为传入的uri