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的实际实现者)传至实际的硬件来实现播放


更多相关文章

  1. C语言函数的递归(上)
  2. Android(安卓)Input流程
  3. Android(安卓)Media Framework(4): 支持格式的扩展
  4. Android(安卓)sdcard读写文件(二)
  5. android 遍历assets下的文件
  6. Android(安卓)三种获取页面数据方法
  7. 将新的驱动源文件添加进android内核进行编译
  8. A31S-camera流程
  9. android默认允许usb调试和usb权限

随机推荐

  1. 让nginx日志支持json格式
  2. Flutter高级进阶实战 仿哔哩哔哩APP
  3. 外显子组测序数据分析
  4. 组蛋白修饰预测基因表达
  5. 对复杂网络节点重要性的排序方法
  6. 无义介导的mRNA衰变是有意义的
  7. 互联网测试校招系列2:准备越充分,机会越大!
  8. phpstorm激活码 2021年4月phpstorm激活码
  9. 【培训】DNA甲基化与表观基因组学数据挖
  10. 单细胞表观基因组学:记录过去和预测未来