sig
  type t
  type message_type =
      [ `Any
      | `Application
      | `Async_done
      | `Async_start
      | `Buffering
      | `Clock_lost
      | `Clock_provide
      | `Duration_changed
      | `Element
      | `End_of_stream
      | `Error
      | `Have_context
      | `Info
      | `Latency
      | `Need_context
      | `New_clock
      | `Progress
      | `Qos
      | `Request_state
      | `Reset_time
      | `Segment_done
      | `Segment_start
      | `State_changed
      | `State_dirty
      | `Step_done
      | `Step_start
      | `Stream_start
      | `Stream_status
      | `Structure_change
      | `Tag
      | `Toc
      | `Unknown
      | `Warning ]
  type message_payload =
      [ `Application
      | `Async_done
      | `Async_start
      | `Buffering of int
      | `Clock_lost
      | `Clock_provide
      | `Duration_changed
      | `Element
      | `End_of_stream
      | `Error of string
      | `Have_context
      | `Info of string
      | `Latency
      | `Need_context
      | `New_clock
      | `Progress
      | `Qos
      | `Request_state
      | `Reset_time
      | `Segment_done
      | `Segment_start
      | `State_changed of
          Gstreamer.Element.state * Gstreamer.Element.state *
          Gstreamer.Element.state
      | `State_dirty
      | `Step_done
      | `Step_start
      | `Stream_start
      | `Stream_status
      | `Structure_change
      | `Tag of (string * string list) list
      | `Toc
      | `Unknown
      | `Warning of string ]
  type message = {
    source : string;
    payload : Gstreamer.Bus.message_payload;
  }
  val of_element : Gstreamer.Element.t -> Gstreamer.Bus.t
  val pop_filtered :
    Gstreamer.Bus.t ->
    Gstreamer.Bus.message_type list -> Gstreamer.Bus.message option
  val timed_pop_filtered :
    Gstreamer.Bus.t ->
    ?timeout:Stdlib.Int64.t ->
    Gstreamer.Bus.message_type list -> Gstreamer.Bus.message
end