Android Audio Architecture 圖如下所示
詳細調用路徑如下
1. 音頻播放
範例程式碼
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();
1.1 MediaPlayer mp = new MediaPlayer()
實現流程如下表:
函數名 |
檔案名稱 |
MediaPlayer:: MediaPlayer |
MediaPlayer.Java |
MediaPlayer::native_setup |
MediaPlayer.Java |
android_media_MediaPlayer_native_setup |
android_media_MediaPlayer.cpp |
MediaPlayer::MediaPlayer |
MediaPlayer.cpp |
1.2 mp.setDataSource(PATH_TO_FILE);
實現流程如下:
函數名 |
檔案名稱 |
MediaPlayer::setDataSource |
MediaPlayer.Java |
android_media_MediaPlayer_setDataSource |
android_media_MediaPlayer.cpp |
MediaPlayer::setDataSource |
MediaPlayer.cpp |
-MediaPlayer::getMediaPlayerService |
MediaPlayer.cpp |
-IMediaPlayerService |
IMediaPlayerService.h |
-IMediaPlayerService::create |
MediaPlayer.cpp |
--MediaPlayerService::create |
MediaPlayerService.cpp |
-IMediaPlayer::setDataSource |
MediaPlayer.cpp |
--BpMediaPlayer::setDataSource |
IMediaPlayer.cpp |
--MediaPlayerService::Client::setDataSource(真正執行操作) |
MediaPlayerService.cpp |
--android::createPlayer |
MediaPlayerService.cpp |
-- new StagefrightPlayer |
MediaPlayerService.cpp |
--new AudioOutput |
MediaPlayerService.cpp |
--StagefrightPlayer::setDataSource |
StagefrightPlayer.cpp |
--AwesomePlayer::setDataSource |
AwesomePlayer.cpp |
--AwesomePlayer::setDataSource_l |
AwesomePlayer.cpp |
1.3 mp.prepare()
函數名 |
檔案名稱 |
MediaPlayer:: prepare |
MediaPlayer.Java |
android_media_MediaPlayer_prepare |
android_media_MediaPlayer.cpp |
MediaPlayer:: prepare |
MediaPlayer.cpp |
MidiFile:: prepare |
MidiFile.cpp |
VorbisPlayer:: prepare |
VorbisPlayer.cpp |
VorbisPlayer::createOutputTrack |
VorbisPlayer.cpp |
AudioOutput::open |
MediaPlayerService.cpp |
AudioTrack::AudioTrack |
AudioTrack.cpp |
AudioSystem::get_audio_flinger |
AudioSystem.cpp |
AudioFlinger::createTrack |
AudioFlinger.cpp |
|
|
|
|
1.4 mp.start()
函數名 |
檔案名稱 |
MediaPlayer:: start |
MediaPlayer.Java |
android_media_MediaPlayer_start |
android_media_MediaPlayer.cpp |
MediaPlayer::start |
MediaPlayer.cpp |
PVPlayer:: start |
PVPlayer.h |
MidiFile:: start |
MidiFile.cpp |
VorbisPlayer:: start |
VorbisPlayer.cpp |
AudioTrack::start |
AudioTrack.cpp |
MediaPlayerService:: MediaPlayerService(MediaPlayerService.cpp)由systemserver進程建立,在檔案system_init.cpp裡的函數system_init()調用MediaPlayerService::instantiate建立
getPlayerType(MediaPlayerService.cpp)返回3種player:
1) PV_PLAYER:播放mp3
2) SONIVOX_PLAYER:播放midi
3) VORBIS_PLAYER:播放ogg,
簡單說來,播放流程如下:
Java端發起調用,MediaPlayer會轉至MediaPlayerService,然後會調用相應的解碼工具解碼後建立AudioTrack,所有待輸出的AudioTrack在AudioFlinger::AudioMixer裡合成,然後通過AudioHAL(AudioHardwareInterface的實際實現者)傳至實際的硬體來實現播放