Android Audio 数据流详解

来源:互联网 发布:nginx log 路径 编辑:程序博客网 时间:2024/05/29 11:26

 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.JavaMediaPlayer::native_setupMediaPlayer.Javaandroid_media_MediaPlayer_native_setupandroid_media_MediaPlayer.cppMediaPlayer::MediaPlayerMediaPlayer.cpp

 

1.2 mp.setDataSource(PATH_TO_FILE);

实现流程如下:

函数名文件名MediaPlayer::setDataSourceMediaPlayer.Javaandroid_media_MediaPlayer_setDataSourceandroid_media_MediaPlayer.cppMediaPlayer::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.cppMediaPlayer:: 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.Javaandroid_media_MediaPlayer_startandroid_media_MediaPlayer.cppMediaPlayer::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的实际实现者)传至实际的硬件来实现播放