音频流分析 三

338 阅读1分钟

​一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

4 Audio本地API--JNI层

所涉及的代码路径:

\frameworks\base\media\jni*.*

\frameworks\base\core\jni*.*\

所涉及的主要代码:

android_media_MediaPlayer.cpp

android_media_MediaRecorder.cpp

android_media_AudioRecord.cpp

android_media_AudioTrack.cpp

android_media_AudioSystem.cpp

5 c/c++框架层

在文件AudioTrack.java中new AudioTrack()

=>在文件android_media_audioTrack.cpp中调用android_media_AudioTrack_native_setup

=>在文件AudioTrack.cpp中调用set函数中存在mAudioTrackThread = new AudioTrackThread\

然后分析如何启动AudioTrackThread线程

=>分析AudioTrack.cpp中的AudioTrack::start()函数会调用mAudioTrack->start()

=>实际上会调用AudioTrack.cpp中AudioFlinger::TrackHandle::start()

=>在AudioTrack.cpp中的AudioFlinger::TrackHandle::start()实际上会调用mTrack->start()

=>然后会调用AudioFlinger.cpp中的AudioFlinger::PlaybackThread::Track::start() 函数

=>然后分析AudioFlinger::ThreadBase::TrackBase,因为Track继承自TrackBase ​ ​

 6 HAL硬件抽象层

HAL Layer代码位置:~\hardware\alsa_sound*.*;  ~\hardware\libhardware_legacy\include\hardware_legacy*.*
~\hardware\mx5x\modules\alsa\alsa_imx5x.cpp
~\hardware\alsa_sound\AudioHardwareALSA.cpp
~\hardware\alsa_sound\ALSAStreamOps.cpp
~\hardware\alsa_sound\AudioStreamOutALSA.cpp
~\hardware\alsa_sound\AudioStreamInALSA.cpp
~\hardware\alsa_sound\ALSAControl.cpp
~\hardware\alsa_sound\ALSAMixer.cpp
~\hardware\libhardware_legacy\include\hardware_legacy\AudioHardwareBase.h
~\hardware\libhardware_legacy\include\hardware_legacy\AudioHardwareInterface.h
~\hardware\libhardware_legacy\include\hardware_legacy\AudioPolicyInterface.h
~\hardware\libhardware_legacy\include\hardware_legacy\AudioPolicyManagerBase.h

7 Alsa Lib和Alsa Driver

        一般来讲,在ALSA的架构中,存在Alsa Lib和Alsa Driver,主要是用于衔接用户空间和内核空间的函数库。

Alsa Lib Layer代码位置:~\external\alsa-lib\src\pcm*.*
~\external\alsa-lib\src\pcm\pcm.c
~\external\alsa-lib\src\pcm\Pcm_empty.c
~\external\alsa-lib\src\pcm\Pcm_asym.c
~\external\alsa-lib\src\pcm\Pcm_plug.c
~\external\alsa-lib\src\pcm\pcm_dmix.c
~\external\alsa-lib\src\pcm\Pcm_hw.c
~\external\alsa-lib\src\pcm\Pcm\params.c
~\external\alsa-lib\src\pcm\Pcm\pcm_direct.c
~\external\alsa-lib\src\pcm\Pcm\pcm_local.h

Alsa Driver Layer代码位置:~\kernel_imx\sound\core*.*
~\kernel_imx\sound\core\Pcm_native.c
~\kernel_imx\sound\core\Pcm_lib.c
~\kernel_imx\sound\core\Soc-core.c
~\kernel_imx\sound\Soc\Soc-dapm.c

8 播放流程分析

MediaPlaybackService.java----ServiceStub—play(mService:MediaPlaybackService)
MediaPlaybackService.java----MediaPlaybackService—play(mPlayer:MultiPlayer)
MediaPlaybackService.java---- MultiPlayer—start
MediaPlayer.java----MediaPlayer—start
MediaPlayer.java----MediaPlayer—_start
Android_media_MediaPlayer.cpp---- android_media_MediaPlayer_start(mp:MediaPlayer)
Android_media_MediaPlayer.cpp----mp->start
MediaPlayer.cpp----start(mPlayer: IMediaPlayer)
IMediaPlayer.cpp----start
IMediaPlayer.cpp----remote()->transact(START, data, &reply)
IMediaPlayer.cpp----BnMediaPlayer::onTransact
IMediaPlayer.cpp----START--reply->writeInt32(start());
MediaPlayerService.cpp----MediaPlayerService::Client::start ()(p:MediaPlayerBase)
MediaPlayerService.cpp----MediaPlayerService::AudioOutput::start ()
MediaPlayerService.cpp----mTrack->pause()(mTrack:AudioTrack--TrackHandle)
AudioFlinger.cpp----AudioFlinger::TrackHandle::start()(mTrack: Track)
AudioFlinger.cpp----AudioFlinger::PlaybackThread::Track::start()
AudioFlinger.cpp----AudioSystem::startOutput
AudioFlinger.cpp----AudioSystem::startOutput
AudioSystem.cpp---- aps-> startOutput(aps:AudioPolicyService)
AudioPolicyService----mpPolicyManager->startOutput(mpPolicyManager: AudioPolicyManagerBase)
AudioPolicyManagerBase.cpp----AudioPolicyManagerBase::startOutput
AudioPolicyManagerBase.cpp----AudioPolicyManagerBase::setOutputDevice

9 暂停流程分析

MediaPlaybackService.java----ServiceStub—pause
MediaPlaybackService.java---- MediaPlaybackService—pause
MediaPlaybackService.java---- MultiPlayer—pause
MediaPlayer.java----MediaPlayer—pause
MediaPlayer.java----MediaPlayer—_pause
Android_media_MediaPlayer.cpp----android_media_MediaPlayer_pause
Android_media_MediaPlayer.cpp----mp->pause
MediaPlayer.cpp----pause
IMediaPlayer.cpp----pause
IMediaPlayer.cpp----remote()->transact(PAUSE, data, &reply)
IMediaPlayer.cpp----BnMediaPlayer::onTransact
IMediaPlayer.cpp----PAUSE--reply->writeInt32(pause());
MediaPlayerService.cpp----MediaPlayerService::Client::pause()
MediaPlayerService.cpp----MediaPlayerService::AudioOutput::pause()
MediaPlayerService.cpp----mTrack->pause()
AudioFlinger.cpp----AudioFlinger::TrackHandle::pause()
AudioFlinger.cpp----AudioFlinger::PlaybackThread::Track::pause()
AudioFlinger.cpp----AudioSystem::stopOutput
AudioSystem.cpp---- aps->stopOutput
AudioPolicyService----mpPolicyManager->stopOutput
AudioPolicyManagerBase.cpp----AudioPolicyManagerBase::stopOutput
AudioPolicyManagerBase.cpp----AudioPolicyManagerBase::setOutputDevice
从setOutputDevice函数中的代码上分析来看,暂停的过程,stopOutput实际上就是将output的device设置为0.主要的代码摘抄如下:
AudioOutputDescriptor *outputDesc = mOutputs.valueFor(output);
Device=getNewDevice(output);//作为参数传入
outputDesc->mDevice = device;//实际上未执行此句代码

此外当拔掉耳机或者断开蓝牙的情况,播放都会暂停。详情请参考

setParameters—setDeviceConnectionState函数的分析。
AudioSystem.java----AudioServiceBroadcastReceiver---- setDeviceConnectionState
AudioSystem.java----setDeviceConnectionState
Android_media_AudioSystem.cpp---- android_media_AudioSystem_setDeviceConnectionState
Android_media_AudioSystem.cpp---- check_AudioSystem_Command
AudioSystem.cpp---- setDeviceConnectionState
AudioPolicyService.cpp----setDeviceConnectionState
AudioPolicyManagerBase.cpp----setDeviceConnectionState
AudioPolicyManagerBase.cpp----setDeviceConnectionState—setParameters
AudioPolicyManagerBase.cpp----setForceUse—setParameters
AudioPolicyManagerBase.cpp----getOutput—setParameters
AudioPolicyManagerBase.cpp----startInput—setParameters
AudioPolicyManagerBase.cpp----stopInput—setParameters
AudioPolicyManagerBase.cpp---- AudioPolicyManagerBase—setParameters
AudioPolicyManagerBase.cpp---- handleA2dpConnection—setParameters
AudioPolicyManagerBase.cpp---- closeA2dpOutputs—setParameters
AudioPolicyManagerBase.cpp---- setOutputDevice—setParameters
AudioPolicyService.cpp----setParameters
AudioPolicyService.cpp----AudioPolicyService::AudioCommandThread::parametersCommand
AudioPolicyService.cpp----insertCommand_l
AudioPolicyService.cpp----AudioCommandThread::threadLoop--AudioSystem::setParameters
AudioSystem.cpp----setParameters-- af->setParameters
AudioFlinger.cpp----setParameters--mAudioHardware->setParameters
AudioHardwareALSA.h----setParameters--ALSAStreamOps::setParameters
ALSAStreamOps.cpp----setParameters
ALSAStreamOps.cpp----mParent->mALSADevice->route
Alsa_imx5x.cpp----s_route
Alsa_imx5x.cpp----setDefaultControls