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的实际实现者)传至实际的硬件来实现播放
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow