视频流分析 三

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值