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 代表音频资源的接口
阅读(2214) | 评论(0) | 转发(0) |