Android Audio 数据流详解

 Android Audio Architecture 图如下所示

 

详细调用路径如下

1. 音频播放
示例代码
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(PATH_TO_FILE);
mp.prepare();
mp.start();

 

1.1 MediaPlayer mp = new MediaPlayer()

实现流程如下表:

函数名文件名
MediaPlayer:: MediaPlayerMediaPlayer.Java
MediaPlayer::native_setupMediaPlayer.Java
android_media_MediaPlayer_native_setupandroid_media_MediaPlayer.cpp
MediaPlayer::MediaPlayerMediaPlayer.cpp

 

1.2 mp.setDataSource(PATH_TO_FILE);

实现流程如下:

函数名文件名
MediaPlayer::setDataSourceMediaPlayer.Java
android_media_MediaPlayer_setDataSourceandroid_media_MediaPlayer.cpp
MediaPlayer::setDataSource

MediaPlayer.cpp

   -MediaPlayer::getMediaPlayerServiceMediaPlayer.cpp
   -IMediaPlayerServiceIMediaPlayerService.h
   -IMediaPlayerService::createMediaPlayer.cpp
       --MediaPlayerService::createMediaPlayerService.cpp
   -IMediaPlayer::setDataSourceMediaPlayer.cpp
      --BpMediaPlayer::setDataSourceIMediaPlayer.cpp
          --MediaPlayerService::Client::setDataSource(真正执行操作)MediaPlayerService.cpp
             --android::createPlayerMediaPlayerService.cpp
                    -- new StagefrightPlayerMediaPlayerService.cpp
            --new AudioOutputMediaPlayerService.cpp
           --StagefrightPlayer::setDataSourceStagefrightPlayer.cpp
              --AwesomePlayer::setDataSourceAwesomePlayer.cpp
                  --AwesomePlayer::setDataSource_lAwesomePlayer.cpp

 

1.3 mp.prepare() 

函数名文件名
MediaPlayer:: prepareMediaPlayer.Java
 android_media_MediaPlayer_prepareandroid_media_MediaPlayer.cpp
MediaPlayer:: prepareMediaPlayer.cpp
    MidiFile:: prepareMidiFile.cpp
    VorbisPlayer:: prepare VorbisPlayer.cpp
          VorbisPlayer::createOutputTrackVorbisPlayer.cpp
               AudioOutput::openMediaPlayerService.cpp
                  AudioTrack::AudioTrackAudioTrack.cpp
                       AudioSystem::get_audio_flingerAudioSystem.cpp
                       AudioFlinger::createTrackAudioFlinger.cpp
  
  

 

1.4 mp.start()

函数名文件名
MediaPlayer:: startMediaPlayer.Java
android_media_MediaPlayer_startandroid_media_MediaPlayer.cpp
MediaPlayer::startMediaPlayer.cpp
   PVPlayer:: startPVPlayer.h
   MidiFile:: startMidiFile.cpp
   VorbisPlayer:: startVorbisPlayer.cpp
       AudioTrack::startAudioTrack.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
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值