++static GstBusSyncReply
++bus_sync_handler(GstBus *bus, GstMessage *message, gpointer user_data)
++{
++ struct worker *w = user_data;
++ GstState s;
++
++ switch (GST_MESSAGE_TYPE (message)) {
++ case GST_MESSAGE_REQUEST_STATE:
++ gst_message_parse_request_state (message, &s);
++
++ debug ("corked: %d", (s == GST_STATE_PAUSED));
++
++ /* drop queue data when corked */
++ g_object_set (w->queue,
++ "leaky", (s == GST_STATE_PAUSED) ? 2 /* downstream */ : 0 /* no */,
++ NULL);
++ gst_element_set_state (w->pwelem, s);
++
++ /* flush the queue when resuming */
++ if (s == GST_STATE_PLAYING) {
++ gst_element_send_event (w->queue, gst_event_new_flush_start ());
++ gst_element_send_event (w->queue, gst_event_new_flush_stop (FALSE));
++ }
++ break;
++ default:
++ break;
++ }
++
++ gst_message_unref (message);
++ return GST_BUS_DROP;
++}
++