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