MT6225上的
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
......
更多详细内容请下载附件查看