对MTK中媒体播放器的的认识

Mtk 6225及6235上的audio player 的结构整体上可以分为三层, 最上面的应用程序界面层, 中间的audio 播放api层, 和底层的编解码库及音频驱动. 其结构图大致如下所示: 



由上图可以看出,整个调用层次较深. 我们分别来学习个层. 

1: MMI Task 层 
   在该层 audio player 模块实现了播放器程序, 其中主要包括对界面视图的实现, 界 
面逻辑的处理以及调用MID模块的接口,实现音频操作. 在学习其具体的实现细节上, 
可以按view 和 model+control的简化MVC模式来看, 包含与显示有关的screen操作显 
示部分, 处理消息的msghandler部分以及主的程序逻辑及按键处理部分. MTK平台对事 
件的处理是通过callback function方式, 所以程序的流程不是顺序的, 事件的发生将导 
致相应的callback被调用, 从而触发整个audio player的一次响应. 需要注意的是,在每个 
不同的界面对相同事件的处理callback函数可能有所不同, 这是在创建,进入该界面时 
设定的.  该模块的接口比较复杂,为了提供对BT的统一接口, 有两层的播放接口,如 
mmi_audply_play 和 mmi_audply_do_play_action(). 整个模块的接口不够清晰, 有些 
庞杂和混乱.  模块的显示部分使用控件实现,较为简单, 可进一步参考控件的实现细节 
以了解平台的显示子系统, 对播放文件列表的管理是通过文件操作实现的,具体可参见 
audioplayerplaylist部分. 
MDI层和Media接口层,这两个部分可看作一个整体, 是MMI层对媒体操作的封装. 
它包括了多个部分的接口,在此我们只看audio接口部分,其他模块如video,fm的接口类 
似. Audio接口包括了播放,暂停,停止,获取播放时间,获取播放频谱等. 这些接口基本 
上都是按同步处理方式实现的. 比如播放接口: 
   MDI层接口是 
mdi_result mdi_audio_play_file(void *file_name, U8 play_style, void *cache_p, mdi_callback handler); 


调用的Media接口为: 
kal_int32 media_aud_play_file(module_type src_mod_id, void *file_param) 

aud_result = MED_RES_OK; 
    aud_send_play_file_req(src_mod_id, file_param); 
    AUD_WAIT_EVENT(AUD_EVT_PLAY); 
    return aud_result; 

其中的aud_send_play_file_req(src_mod_id, file_param调用msg_send_ext_queue(ilm_ptr); 
向media task的external Message queue 发送播放请求消息. 
其中AUD_WAIT_EVENT(AUD_EVT_PLAY);定义如下: 
#define AUD_WAIT_EVENT(evt_) do{                                  \ 
         kal_uint32 retrieved_events;                                   \ 
         kal_retrieve_eg_events(aud_context_p->aud_event, (evt_),           \ 
         KAL_OR_CONSUME, &retrieved_events, KAL_SUSPEND); }while(0) 
等待AUD_EVT_PLAY事件的到达. 通过事件实现了同步. 

2: Media Task层, media task启动后, med_task_main在获得外部消息后,调用 
med_main((void*)&current_ilm);进行消息处理, med_main会根据消息类型再进行一次 
分发 ,audio消息会被分发给void aud_main(ilm_struct *ilm_ptr)来进行处理. 根据相应的 
请求消息,aud_main调用相应的handler函数进行处理. 
如对播放请求消息MSG_ID_L4AUD_MEDIA_PLAY_REQ的处理函数如下: 
void aud_media_play_req_hdlr(ilm_struct *ilm_ptr) 

…. // 省略其他分支处理,及错误处理 

// step 1::释放冲突资源, 设置播放的参数等 

// step 2: 根据格式选择播放函数 
switch (aud_context_p->current_format) 
{     
     ... 
     case MED_TYPE_MMF: 
      result = aud_melody_play_by_name(msg_p->file_name, msg_p->play_style, 0); 
      break; 
    … 
    case MED_TYPE_M4A:  
      aud_context_p->source_type = AUD_FILE; 
      aud_context_p->play_style = msg_p->play_style; 
      result = aud_media_play_file_stream( 
              msg_p->file_name, 
              msg_p->play_style, 
              1, 
              KAL_FALSE, 
              msg_p->cache_p); 
       break; 
           case MED_TYPE_3GP: 
       case MED_TYPE_MP4: 
            aud_context_p->source_type = AUD_FILE; 
            aud_context_p->play_style = msg_p->play_style; 
            result = aud_media_play_audio_track_in_video( 
                        msg_p->file_name, 
                        msg_p->play_style, 
                        KAL_TRUE, 
                        KAL_FALSE); 
            break; 
        default: 
            result = MED_RES_INVALID_FORMAT; 
            break; 


// step 3: 开始播放后处理 
aud_set_result((kal_int32) result);        // 设置播放操作返回结果 
AUD_SET_EVENT(AUD_EVT_PLAY);  // 设置AUD_EVT_PLAY事件 
if (aud_context_p->src_mod != MOD_MMI) //播放请求是否来自MMI task 

     aud_send_media_play_cnf(result);   //发送播放反馈消息到请求模块 
}  


3:L1Audio module层, 该层包括了底层的解码库和对更底层的驱动程序,及音频硬件 
的调用和处理. 其中包括了对具体的音频格式的处理接口,如对AAC文件的接口有: 
MHdl *AAC_Open(void(*handler)( MHdl *handle, Media_Event event ), 
STFSAL *pstFSAL, void *param) 
Media_Status aacMFPlayFile( MHdl *hdl ); 
Media_Status aacMFResumeFile( MHdl *hdl ); 
Media_Status aacMFPause( MHdl *hdl ); 
Media_Status aacMFStop( MHdl *hdl ); 
.... 
一整套的接口. 在上面的第二层的讲解中的play请求的处理函数中, 如果待处理的文 
件格式是AAC, 则实现上它会调用AAC_Open接口来获得与播放操作相关的所有函 
数接口. 为此后的其他操作提供处理函数. 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值