media server分析
来源:互联网 发布:java 多线程 pdf 编辑:程序博客网 时间:2024/05/15 11:20
media server是android的一个重要服务,主要是与多媒体相关的一些系统服务。在 ServiceManager相关中我们已经分析了,media server是在系统init.rc脚本中启动的,并且在service manager之后。由于media server中包含了media player、audio flinger、camera等多个service相关的东西,本文则只取其中的media player service分析media server和service manager之间的交互。
1、main_mediaserver.cpp
main_mediaserver.cpp文件位于/av/media/mediaserver/目录。该目录下的Android.mk文件中可以清楚看出,media server中包含了多个部分,并且最终编译成了一个名为mediaserver的可执行文件。可执行文件存放在系统的/system/bin/目录下,和init.rc中配置的media进程的可执行文件路径一致。
LOCAL_C_INCLUDES := \ frameworks/av/media/libmediaplayerservice \ frameworks/av/services/audioflinger \ frameworks/av/services/camera/libcameraservice \ frameworks/native/services/audioflingerLOCAL_MODULE:= mediaserver // 编译模块名include $(BUILD_EXECUTABLE) // 编译成可执行文件
main_mediaserver.cpp的代码很简单。主要是创建binder通讯的环境,初始化多个service,然后进入循环talk with binder driver状态。
int main(int argc, char** argv){ signal(SIGPIPE, SIG_IGN); sp<ProcessState> proc(ProcessState::self()); // 初始化一个ProcessState对象 sp<IServiceManager> sm = defaultServiceManager(); // 初始化BpServiceManager对象 ALOGI("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); MediaPlayerService::instantiate(); // media player service初始化 CameraService::instantiate(); AudioPolicyService::instantiate(); ProcessState::self()->startThreadPool(); // 启动PooledThread IPCThreadState::self()->joinThreadPool(); // talk with binder driver循环}
2、MediaPlayerService.cpp
文件位于/av/media/libmediaplayerservice/目录。
void MediaPlayerService::instantiate() { defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService());}// 创建一个MediaPlayer对象sp<IMediaPlayer> MediaPlayerService::create(pid_t pid, const sp<IMediaPlayerClient>& client, int audioSessionId){ int32_t connId = android_atomic_inc(&mNextConnId); sp<Client> c = new Client( this, pid, connId, client, audioSessionId, IPCThreadState::self()->getCallingUid()); ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid, IPCThreadState::self()->getCallingUid()); wp<Client> w = c; { Mutex::Autolock lock(mLock); mClients.add(w); } return c;}
在init时,直接获取到一个BpServiceManager对象,并通过其addService()接口,添加了一个MediaPlayerService对象到ServiceManager。defaultServiceManager()和addService()接口我们在native binder相关类中已经分析过了,前者将返回一个由一个handle == 0的BpBinder构造出来的BpServiceManager,而addService()方法将会调用到service_manager.c中的do_add_service()方法。需要注意的是service manager的Bn端实现,和普通的binder接口的Bn端实现不一样。普通的binder接口的Bn端,都有一个onTransact()方法,在该方法里对binder命令解析,并分发到接口方法的实现里。service manager的Bn端没有onTransact()接口,而是在一个binder_loop()循环中,不断的解析binder命令,并返回数据。具体分析可以参考ServiceManager启动流程
- media server分析
- Flash Media Server起步
- Flash Media Server
- window media Server
- Flash Media Server 2.0
- Flash Media Server 入门教程
- about wins media server
- Flash Media Server 入门教程
- Flash Media Server 入门教程
- Flash Media Server简介
- Flash Media Server
- Flash Media Server配置
- LIVE555 Media Server
- SIP Express Media Server
- Flash Media Server 4.5
- 关于Flash Media Server
- defcon media server
- MSN Media协议分析
- toString()方法
- Easy-题目59:204. Count Primes
- Android系统架构
- 写出这个数
- hdu 1874 畅通工程续(bellman-ford,dijkstra)
- media server分析
- LVS负载均衡的三种模式和八种算法总结
- mysql 默认引擎innodb 初探(二)
- Easy-题目60:125. Valid Palindrome
- 三种妙法搞定冗余表数据一致性
- iOS中NSAttributedString用法
- IM通讯协议总结之二XMPP协议
- kali
- WIN7X64 安装Wampserver 2.5 启动提示“丢失MSVCR110.dll”