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:: 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

猜你喜欢

转载自blog.csdn.net/hddghhfd/article/details/86644048
今日推荐