"type": "GstJackConnect",
"writable": true
},
+ "low-latency": {
+ "blurb": "Optimize all settings for lowest latency. When enabled, \"buffer-time\" and \"latency-time\" will be ignored",
+ "conditionally-available": false,
+ "construct": false,
+ "construct-only": false,
+ "controllable": false,
+ "default": "false",
+ "mutable": "ready",
+ "readable": true,
+ "type": "gboolean",
+ "writable": true
+ },
"port-pattern": {
"blurb": "A pattern to select which ports to connect to (NULL = first physical ports)",
"conditionally-available": false,
"type": "GstJackConnect",
"writable": true
},
+ "low-latency": {
+ "blurb": "Optimize all settings for lowest latency. When enabled, \"buffer-time\" and \"latency-time\" will be ignored",
+ "conditionally-available": false,
+ "construct": false,
+ "construct-only": false,
+ "controllable": false,
+ "default": "false",
+ "mutable": "ready",
+ "readable": true,
+ "type": "gboolean",
+ "writable": true
+ },
"port-pattern": {
"blurb": "A pattern to select which ports to connect to (NULL = first physical ports)",
"conditionally-available": false,
(GST_SECOND / GST_USECOND), rate * bpf);
/* segtotal based on buffer-time latency */
spec->segtotal = spec->buffer_time / spec->latency_time;
- if (spec->segtotal < 2) {
+
+ /* Use small period when low-latency is enabled regardless of buffer-time */
+ if (spec->segtotal < 2 || sink->low_latency) {
spec->segtotal = 2;
spec->buffer_time = spec->latency_time * spec->segtotal;
}
#define DEFAULT_PROP_CLIENT_NAME NULL
#define DEFAULT_PROP_PORT_PATTERN NULL
#define DEFAULT_PROP_TRANSPORT GST_JACK_TRANSPORT_AUTONOMOUS
+#define DEFAULT_PROP_LOW_LATENCY FALSE
enum
{
PROP_CLIENT_NAME,
PROP_PORT_PATTERN,
PROP_TRANSPORT,
+ PROP_LOW_LATENCY,
PROP_LAST
};
GST_TYPE_JACK_TRANSPORT, DEFAULT_PROP_TRANSPORT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstJackAudioSink:low-latency:
+ *
+ * Optimize all settings for lowest latency. When enabled,
+ * #GstAudioBaseSink:buffer-time and #GstAudioBaseSink:latency-time will be
+ * ignored.
+ *
+ * Since: 1.20
+ */
+ g_object_class_install_property (gobject_class, PROP_LOW_LATENCY,
+ g_param_spec_boolean ("low-latency", "Low latency",
+ "Optimize all settings for lowest latency. When enabled, "
+ "\"buffer-time\" and \"latency-time\" will be ignored",
+ DEFAULT_PROP_LOW_LATENCY,
+ GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
gst_element_class_set_static_metadata (gstelement_class, "Audio Sink (Jack)",
"Sink/Audio", "Output audio to a JACK server",
"Wim Taymans <wim.taymans@gmail.com>");
sink->buffers = NULL;
sink->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME);
sink->transport = DEFAULT_PROP_TRANSPORT;
+ sink->low_latency = DEFAULT_PROP_LOW_LATENCY;
}
static void
case PROP_TRANSPORT:
sink->transport = g_value_get_flags (value);
break;
+ case PROP_LOW_LATENCY:
+ sink->low_latency = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_TRANSPORT:
g_value_set_flags (value, sink->transport);
break;
+ case PROP_LOW_LATENCY:
+ g_value_set_boolean (value, sink->low_latency);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gchar *client_name;
gchar *port_pattern;
guint transport;
+ gboolean low_latency;
/* our client */
GstJackAudioClient *client;
(GST_SECOND / GST_USECOND), rate * bpf);
/* segtotal based on buffer-time latency */
spec->segtotal = spec->buffer_time / spec->latency_time;
- if (spec->segtotal < 2) {
+
+ /* Use small period when low-latency is enabled regardless of buffer-time */
+ if (spec->segtotal < 2 || src->low_latency) {
spec->segtotal = 2;
spec->buffer_time = spec->latency_time * spec->segtotal;
}
#define DEFAULT_PROP_CLIENT_NAME NULL
#define DEFAULT_PROP_TRANSPORT GST_JACK_TRANSPORT_AUTONOMOUS
#define DEFAULT_PROP_PORT_PATTERN NULL
+#define DEFAULT_PROP_LOW_LATENCY FALSE
+
enum
{
PROP_0,
PROP_CLIENT_NAME,
PROP_PORT_PATTERN,
PROP_TRANSPORT,
+ PROP_LOW_LATENCY,
PROP_LAST
};
GST_TYPE_JACK_TRANSPORT, DEFAULT_PROP_TRANSPORT,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GstJackAudioSrc:low-latency:
+ *
+ * Optimize all settings for lowest latency. When enabled,
+ * #GstAudioBaseSrc:buffer-time and #GstAudioBaseSrc:latency-time will be
+ * ignored.
+ *
+ * Since: 1.20
+ */
+ g_object_class_install_property (gobject_class, PROP_LOW_LATENCY,
+ g_param_spec_boolean ("low-latency", "Low latency",
+ "Optimize all settings for lowest latency. When enabled, "
+ "\"buffer-time\" and \"latency-time\" will be ignored",
+ DEFAULT_PROP_LOW_LATENCY,
+ GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
gst_element_class_add_static_pad_template (gstelement_class, &src_factory);
gst_element_class_set_static_metadata (gstelement_class,
src->buffers = NULL;
src->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME);
src->transport = DEFAULT_PROP_TRANSPORT;
+ src->low_latency = DEFAULT_PROP_LOW_LATENCY;
}
static void
case PROP_TRANSPORT:
src->transport = g_value_get_flags (value);
break;
+ case PROP_LOW_LATENCY:
+ src->low_latency = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_TRANSPORT:
g_value_set_flags (value, src->transport);
break;
+ case PROP_LOW_LATENCY:
+ g_value_set_boolean (value, src->low_latency);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gchar *client_name;
gchar *port_pattern;
guint transport;
+ gboolean low_latency;
/* our client */
GstJackAudioClient *client;