DirectShow开发基础( 三 )------DirectShow中的事件通知机制

DirectShow开发基础( 三 )------DirectShow中的事件通知机制
事件通知机制
    DirectShow中的事件通知类似于Windows中的消息队列机制。各种滤波器、滤波器链表管理器等都是通过事件通知的方式和应用程序交互、通信的。比如媒体的运行、暂停或停止状态,滤波器发送相应的事件给应用程序,以便我们做相关的处理,如打开文件、显示或重启播放等。
检索事件
    滤波器链表管理器暴露了3个接口用来处理事件通知。
  • IMediaEventSink:滤波器用这个接口来发布事件。
  • IMediaEvent:应用程序用这个接口来从队列中检索事件。
  • IMediaEventEx:IMediaEvent的继承和扩展。
    滤波器都是通过调用链表管理器的IMediaEventSink::Notify方法来通知图表管理器某种事件的发生。
    应用程序通过调用图表管理器的IMediaEvent::GetEvent方法来从事件队列中获取事件。
    为了重载滤波器链表管理器对事件的默认处理,可以使用某个事件码作为参数来调用IMediaEvent::CancelDefaultHandling,这样就可以屏蔽图表管理器对某个事件友的默认处理。
    如果要恢复,则调用IMediaEvent::RestoreDefaultHandling。
    如果图表管理器没有对某个事件码默认处理,则调用这两个函数也起不了作用。

分析事件
    为了处理DirectShow事件,链表管理器提供了两种方法来获取正在队列中等待的事件。
  • 窗口通知,链表管理器发送开发者自己预定义的窗口消息到应用程序窗口。
  • 事件信息,如果队列中有DirectShow事件,链表管理器就用事件信号通知应用程序,如果队列为空就重新复位事件信号。


你可能感兴趣的:(DirectShow开发基础( 三 )------DirectShow中的事件通知机制)