随笔-27  评论-6  文章-0  trackbacks-0
事件通知机制
    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 阅读(660) 评论(0)  编辑 收藏 引用 所属分类: 文件、图形与多媒体

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理