channels = GST_AUDIO_INFO_CHANNELS (&buf->spec.info);
+ /* handle transport state requisitions */
+ if (sink->transport == GST_JACK_TRANSPORT_SLAVE) {
+ GstState state = gst_jack_audio_client_get_transport_state (sink->client);
+
+ if ((state != GST_STATE_VOID_PENDING) && (GST_STATE (sink) != state)) {
+ GST_DEBUG_OBJECT (sink, "requesting state change: %s",
+ gst_element_state_get_name (state));
+ gst_element_post_message (GST_ELEMENT (sink),
+ gst_message_new_request_state (GST_OBJECT (sink), state));
+ }
+ }
+
/* get target buffers */
for (i = 0; i < channels; i++) {
sink->buffers[i] =
GST_DEBUG_OBJECT (sink, "start");
+ if (sink->transport == GST_JACK_TRANSPORT_MASTER) {
+ jack_client_t *client;
+
+ client = gst_jack_audio_client_get_client (sink->client);
+ jack_transport_start (client);
+ }
+
return TRUE;
}
GST_DEBUG_OBJECT (sink, "pause");
+ if (sink->transport == GST_JACK_TRANSPORT_MASTER) {
+ jack_client_t *client;
+
+ client = gst_jack_audio_client_get_client (sink->client);
+ jack_transport_stop (client);
+ }
+
return TRUE;
}
GST_DEBUG_OBJECT (sink, "stop");
+ if (sink->transport == GST_JACK_TRANSPORT_MASTER) {
+ jack_client_t *client;
+
+ client = gst_jack_audio_client_get_client (sink->client);
+ jack_transport_stop (client);
+ }
+
return TRUE;
}
#define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO
#define DEFAULT_PROP_SERVER NULL
-#define DEFAULT_PROP_CLIENT_NAME NULL
+#define DEFAULT_PROP_CLIENT_NAME NULL
+#define DEFAULT_PROP_TRANSPORT GST_JACK_TRANSPORT_AUTONOMOUS
enum
{
PROP_SERVER,
PROP_CLIENT,
PROP_CLIENT_NAME,
+ PROP_TRANSPORT,
PROP_LAST
};
GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ /**
+ * GstJackAudioSink:transport
+ *
+ * The jack transport behaviour for the client.
+ *
+ * Since: 0.10.31
+ */
+ g_object_class_install_property (gobject_class, PROP_TRANSPORT,
+ g_param_spec_enum ("transport", "Transport mode",
+ "Jack transport behaviour of the client",
+ GST_TYPE_JACK_TRANSPORT, DEFAULT_PROP_TRANSPORT,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_set_details_simple (gstelement_class, "Audio Sink (Jack)",
"Sink/Audio", "Output audio to a JACK server",
"Wim Taymans <wim.taymans@gmail.com>");
sink->jclient = NULL;
sink->ports = NULL;
sink->port_count = 0;
- sink->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME);
sink->buffers = NULL;
+ sink->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME);
+ sink->transport = DEFAULT_PROP_TRANSPORT;
}
static void
sink->jclient = g_value_get_boxed (value);
}
break;
+ case PROP_TRANSPORT:
+ sink->transport = g_value_get_enum (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_CLIENT:
g_value_set_boxed (value, sink->jclient);
break;
+ case PROP_TRANSPORT:
+ g_value_set_enum (value, sink->transport);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;