Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318766
  • 博文数量: 88
  • 博客积分: 2051
  • 博客等级: 大尉
  • 技术积分: 950
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-14 23:59
文章分类

全部博文(88)

文章存档

2012年(3)

2011年(2)

2010年(9)

2009年(14)

2008年(60)

我的朋友

分类: C/C++

2008-11-21 18:07:45

mmf框架的主要功能就是对多媒体plug-in的管理。
MMF为每个plug-in创建2个线程,一个做client一个做server,这些线程都在调用MMF API的进程中。
client/server之间的ITC是通过TMMFMessage进行的,每一个msg都包括Interface ID和Destination handle,这样MMF框架就知道把这个消息传递给那个server。
 
客户端的大多数api都封装在utility class里面,这些类都有一个RMMFController,server端有与之对应的CMMFController,它们通过RMMFControllerProxy的SendSync和SendAsync发送消息。
 
一个多媒体plug-in的大致需要实现以下几类接口:
􀂃 Controller loading and unloading
􀂃 Managing sources and sinks
􀂃 Changing controller state
􀂃 Adjusting play-head position
􀂃 Retrieving metadata
􀂃 Handling custom commands
􀂃 Event monitoring
 
1. Open and Close
RMMFController::Open(id) - 打开一个plug-in controller,在单独的线程中运行
RMMFController::Close() - 释放对应的controller
 
2. Source and Sink
AddDataSource() 和 AddDataSink()方法用来管理Source 和 Sink, Controller的主要功能就是将数据从source流到sink
 
3.Changing state
一般Controller有Stop, Prime, Play三个状态
 
4.Adjusting play-head position API
查询和调整播放的位置,GetPosition,SetPosition,GetDuration
 
5.Retrieving metadata API
GetMetaDataEntryL用来获得媒体的meta信息
 
6.Handling custom commands API
前面的函数都是标准接口,要想扩展接口,可以通过CustomCommandSync和CustomCommandAsync发出调用函数的请求。server端的函数执行后,可以通过参数返回执行结果。
 
7.Event-monitoring API
前面的6种类型都是client端主动发出的调用,client端可以对感兴趣的事件进行注册,然后server回调其处理方法。CMMFControllerEventMonitor用来接受所有CMMFController发出的事件,如果client端感兴趣,那么就要实现MMMFControllerEventMonitorObserver,这些方法会在CMMFControllerEventMonitor的RunL方法当中得到回调。MMMFControllerEventMonitorObserver的对象会在创建Controller的时候传递。//这部分还需要理解
void RMMFController::ReceiveEvents(
TMMFEventPckg& aEventPckg,
TRequestStatus& aStatus); //这个方法注册并接受事件,事件的详细消息在aEventPckg,因为要跨越线程传递,这个aEventPckg是描述符类型
 
--------------------------MMF Controller Framework---------------------------------
 
一个Controller plug-in可以利用不同的CMMFCodec或者解析文件格式的对象以支持多种媒体格式。如,一个音频Controller plug-in可以支持wav,mp3,aac!
 
整个框架包含以下几种组件:
1.Controller plug-in resolver - 根据source的类型选择合适的controller
根据source去比较plug-in的supplier id, mime type, file extension等,这些信息在plug-in向ECom注册时登记。
 
2.Controller proxy - 负责为controller plug-in分配线程和ITC
其中的RMMFControllerProxy运行在客户端,CMMFControllerProxyServer运行在server端。CMMFControllerProxyServer负责创建用于进行ITC的CMMFControllerProxySession。这个session用来接受从RMMFControllerProxy发出的消息,并由CMMFController处理。继承自该类以实现某种接口的plug-in必须实现CMMFController中的某些方法。
 
3.Controller API - 一组可以与controller plug-in通信的标准API
所有的MMF plug-in都继承自CMMFController,实现其规定的标准API。CMMFController用了工厂模式,在其NewL(id)方法中指定id就可以创建不同的CMMFController对象。
 
4.Custom commands - 用来扩展API
在最基本的方法之上,mmf也内部定义了第一层扩展api,比如得到音频的音量(视频没有这个属性);如果第一层也不能处理这个请求;则需要在CustomCommand()对其进行处理,这里可以对用户定义的方法进行处理
 
5.Helper Class - 供上面这些组件使用
 
小结:前面的internet radio project的提到plug-in就是对某种接口的实现,那么MMF plug-in的接口就是CMMFController;前面的例子直接通过ECom调用plug-in的实例,没有MMF那么复杂。MMF在实现接口的基础上,将调用接口的client和实现接口的server分离在不同的线程当中。
 
 
----------------------------Codec---------------------------------------
HW codec通过dsp实现,SW codec通过ECom plug-in实现
CMMFHWDevice 代表HW codec
CMMFCodec 代表SW codec的接口
 
每种Codec对某一类FourCC的数据格式进行编解码
 
CMMFDevSound 代表音频资源的接口
 
 
 
阅读(2136) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~