事件通知机制 DirectShow中的事件通知类似于Windows中的消息队列机制。各种滤波器、滤波器链表管理器等都是通过事件通知的方式和应用程序交互、通信的。比如媒体的运行、暂停或停止状态,滤波器发送相应的事件给应用程序,以便我们做相关的处理,如打开文件、显示或重启播放等。
检索事件 滤波器链表管理器暴露了3个接口用来处理事件通知。
- IMediaEventSink:滤波器用这个接口来发布事件。
- IMediaEvent:应用程序用这个接口来从队列中检索事件。
- IMediaEventEx:IMediaEvent的继承和扩展。
滤波器都是通过调用链表管理器的IMediaEventSink::Notify方法来通知图表管理器某种事件的发生。
应用程序通过调用图表管理器的IMediaEvent::GetEvent方法来从事件队列中获取事件。
为了重载滤波器链表管理器对事件的默认处理,可以使用某个事件码作为参数来调用IMediaEvent::CancelDefaultHandling,这样就可以屏蔽图表管理器对某个事件友的默认处理。
如果要恢复,则调用IMediaEvent::RestoreDefaultHandling。
如果图表管理器没有对某个事件码默认处理,则调用这两个函数也起不了作用。
分析事件 为了处理DirectShow事件,链表管理器提供了两种方法来获取正在队列中等待的事件。
- 窗口通知,链表管理器发送开发者自己预定义的窗口消息到应用程序窗口。
- 事件信息,如果队列中有DirectShow事件,链表管理器就用事件信号通知应用程序,如果队列为空就重新复位事件信号。
posted on 2010-09-06 00:57
CrazyNerd 阅读(722)
评论(0) 编辑 收藏 引用 所属分类:
文件、图形与多媒体