2 * Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
4 * gstjackaudiosink.c: jack audio sink implementation
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
23 * SECTION:element-jackaudiosink
24 * @see_also: #GstAudioBaseSink, #GstAudioRingBuffer
26 * A Sink that outputs data to Jack ports.
28 * It will create N Jack ports named out_<name>_<num> where
29 * <name> is the element name and <num> is starting from 1.
30 * Each port corresponds to a gstreamer channel.
32 * The samplerate as exposed on the caps is always the same as the samplerate of
35 * When the #GstJackAudioSink:connect property is set to auto, this element
36 * will try to connect each output port to a random physical jack input pin. In
37 * this mode, the sink will expose the number of physical channels on its pad
40 * When the #GstJackAudioSink:connect property is set to none, the element will
41 * accept any number of input channels and will create (but not connect) an
42 * output port for each channel.
44 * The element will generate an error when the Jack server is shut down when it
45 * was PAUSED or PLAYING. This element does not support dynamic rate and buffer
46 * size changes at runtime.
49 * <title>Example launch line</title>
51 * gst-launch-1.0 audiotestsrc ! jackaudiosink
52 * ]| Play a sine wave to using jack.
60 #include <gst/gst-i18n-plugin.h>
63 #include <gst/audio/audio.h>
65 #include "gstjackaudiosink.h"
66 #include "gstjackringbuffer.h"
68 GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_sink_debug);
69 #define GST_CAT_DEFAULT gst_jack_audio_sink_debug
72 gst_jack_audio_sink_allocate_channels (GstJackAudioSink * sink, gint channels)
74 jack_client_t *client;
76 client = gst_jack_audio_client_get_client (sink->client);
78 /* remove ports we don't need */
79 while (sink->port_count > channels) {
80 jack_port_unregister (client, sink->ports[--sink->port_count]);
83 /* alloc enough output ports */
84 sink->ports = g_realloc (sink->ports, sizeof (jack_port_t *) * channels);
85 sink->buffers = g_realloc (sink->buffers, sizeof (sample_t *) * channels);
87 /* create an output port for each channel */
88 while (sink->port_count < channels) {
91 /* port names start from 1 and are local to the element */
93 g_strdup_printf ("out_%s_%d", GST_ELEMENT_NAME (sink),
94 sink->port_count + 1);
95 sink->ports[sink->port_count] =
96 jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE,
98 if (sink->ports[sink->port_count] == NULL)
109 gst_jack_audio_sink_free_channels (GstJackAudioSink * sink)
112 jack_client_t *client;
114 client = gst_jack_audio_client_get_client (sink->client);
116 /* get rid of all ports */
117 while (sink->port_count) {
118 GST_LOG_OBJECT (sink, "unregister port %d", i);
119 if ((res = jack_port_unregister (client, sink->ports[i++]))) {
120 GST_DEBUG_OBJECT (sink, "unregister of port failed (%d)", res);
124 g_free (sink->ports);
126 g_free (sink->buffers);
127 sink->buffers = NULL;
130 /* ringbuffer abstract base class */
132 gst_jack_ring_buffer_get_type (void)
134 static volatile gsize ringbuffer_type = 0;
136 if (g_once_init_enter (&ringbuffer_type)) {
137 static const GTypeInfo ringbuffer_info = {
138 sizeof (GstJackRingBufferClass),
141 (GClassInitFunc) gst_jack_ring_buffer_class_init,
144 sizeof (GstJackRingBuffer),
146 (GInstanceInitFunc) gst_jack_ring_buffer_init,
149 GType tmp = g_type_register_static (GST_TYPE_AUDIO_RING_BUFFER,
150 "GstJackAudioSinkRingBuffer", &ringbuffer_info, 0);
151 g_once_init_leave (&ringbuffer_type, tmp);
154 return (GType) ringbuffer_type;
158 gst_jack_ring_buffer_class_init (GstJackRingBufferClass * klass)
160 GstAudioRingBufferClass *gstringbuffer_class;
162 gstringbuffer_class = (GstAudioRingBufferClass *) klass;
164 ring_parent_class = g_type_class_peek_parent (klass);
166 gstringbuffer_class->open_device =
167 GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_open_device);
168 gstringbuffer_class->close_device =
169 GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_close_device);
170 gstringbuffer_class->acquire =
171 GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_acquire);
172 gstringbuffer_class->release =
173 GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_release);
174 gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
175 gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_pause);
176 gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
177 gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_stop);
179 gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_delay);
182 /* this is the callback of jack. This should RT-safe.
185 jack_process_cb (jack_nframes_t nframes, void *arg)
187 GstJackAudioSink *sink;
188 GstAudioRingBuffer *buf;
191 gint i, j, flen, channels;
194 buf = GST_AUDIO_RING_BUFFER_CAST (arg);
195 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
197 channels = GST_AUDIO_INFO_CHANNELS (&buf->spec.info);
199 /* get target buffers */
200 for (i = 0; i < channels; i++) {
202 (sample_t *) jack_port_get_buffer (sink->ports[i], nframes);
205 if (gst_audio_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
206 flen = len / channels;
208 /* the number of samples must be exactly the segment size */
209 if (nframes * sizeof (sample_t) != flen)
212 GST_DEBUG_OBJECT (sink, "copy %d frames: %p, %d bytes, %d channels",
213 nframes, readptr, flen, channels);
214 data = (sample_t *) readptr;
216 /* the samples in the ringbuffer have the channels interleaved, we need to
217 * deinterleave into the jack target buffers */
218 for (i = 0; i < nframes; i++) {
219 for (j = 0; j < channels; j++) {
220 sink->buffers[j][i] = *data++;
224 /* clear written samples in the ringbuffer */
225 gst_audio_ring_buffer_clear (buf, readseg);
227 /* we wrote one segment */
228 gst_audio_ring_buffer_advance (buf, 1);
230 GST_DEBUG_OBJECT (sink, "write %d frames silence", nframes);
231 /* We are not allowed to read from the ringbuffer, write silence to all
232 * jack output buffers */
233 for (i = 0; i < channels; i++) {
234 memset (sink->buffers[i], 0, nframes * sizeof (sample_t));
242 GST_ERROR_OBJECT (sink, "nbytes (%d) != flen (%d)",
243 (gint) (nframes * sizeof (sample_t)), flen);
250 jack_sample_rate_cb (jack_nframes_t nframes, void *arg)
252 GstJackAudioSink *sink;
253 GstJackRingBuffer *abuf;
255 abuf = GST_JACK_RING_BUFFER_CAST (arg);
256 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
258 if (abuf->sample_rate != -1 && abuf->sample_rate != nframes)
266 GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS,
267 (NULL), ("Jack changed the sample rate, which is not supported"));
274 jack_buffer_size_cb (jack_nframes_t nframes, void *arg)
276 GstJackAudioSink *sink;
277 GstJackRingBuffer *abuf;
279 abuf = GST_JACK_RING_BUFFER_CAST (arg);
280 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
282 if (abuf->buffer_size != -1 && abuf->buffer_size != nframes)
290 GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS,
291 (NULL), ("Jack changed the buffer size, which is not supported"));
297 jack_shutdown_cb (void *arg)
299 GstJackAudioSink *sink;
301 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
303 GST_DEBUG_OBJECT (sink, "shutdown");
305 GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
306 (NULL), ("Jack server shutdown"));
310 gst_jack_ring_buffer_init (GstJackRingBuffer * buf,
311 GstJackRingBufferClass * g_class)
314 buf->buffer_size = -1;
315 buf->sample_rate = -1;
318 /* the _open_device method should make a connection with the server
321 gst_jack_ring_buffer_open_device (GstAudioRingBuffer * buf)
323 GstJackAudioSink *sink;
324 jack_status_t status = 0;
327 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
329 GST_DEBUG_OBJECT (sink, "open");
331 if (sink->client_name) {
332 name = sink->client_name;
334 name = g_get_application_name ();
339 sink->client = gst_jack_audio_client_new (name, sink->server,
341 GST_JACK_CLIENT_SINK,
343 jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status);
344 if (sink->client == NULL)
347 GST_DEBUG_OBJECT (sink, "opened");
354 if (status & JackServerFailed) {
355 GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
356 (_("Jack server not found")),
357 ("Cannot connect to the Jack server (status %d)", status));
359 GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE,
360 (NULL), ("Jack client open error (status %d)", status));
366 /* close the connection with the server
369 gst_jack_ring_buffer_close_device (GstAudioRingBuffer * buf)
371 GstJackAudioSink *sink;
373 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
375 GST_DEBUG_OBJECT (sink, "close");
377 gst_jack_audio_sink_free_channels (sink);
378 gst_jack_audio_client_free (sink->client);
384 /* allocate a buffer and setup resources to process the audio samples of
385 * the format as specified in @spec.
387 * We allocate N jack ports, one for each channel. If we are asked to
388 * automatically make a connection with physical ports, we connect as many
389 * ports as there are physical ports, leaving leftover ports unconnected.
391 * It is assumed that samplerate and number of channels are acceptable since our
392 * getcaps method will always provide correct values. If unacceptable caps are
393 * received for some reason, we fail here.
396 gst_jack_ring_buffer_acquire (GstAudioRingBuffer * buf,
397 GstAudioRingBufferSpec * spec)
399 GstJackAudioSink *sink;
400 GstJackRingBuffer *abuf;
402 gint sample_rate, buffer_size;
403 gint i, rate, bpf, channels, res;
404 jack_client_t *client;
406 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
407 abuf = GST_JACK_RING_BUFFER_CAST (buf);
409 GST_DEBUG_OBJECT (sink, "acquire");
411 client = gst_jack_audio_client_get_client (sink->client);
413 rate = GST_AUDIO_INFO_RATE (&spec->info);
415 /* sample rate must be that of the server */
416 sample_rate = jack_get_sample_rate (client);
417 if (sample_rate != rate)
418 goto wrong_samplerate;
420 channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
421 bpf = GST_AUDIO_INFO_BPF (&spec->info);
423 if (!gst_jack_audio_sink_allocate_channels (sink, channels))
426 buffer_size = jack_get_buffer_size (client);
428 /* the segment size in bytes, this is large enough to hold a buffer of 32bit floats
429 * for all channels */
430 spec->segsize = buffer_size * sizeof (gfloat) * channels;
431 spec->latency_time = gst_util_uint64_scale (spec->segsize,
432 (GST_SECOND / GST_USECOND), rate * bpf);
433 /* segtotal based on buffer-time latency */
434 spec->segtotal = spec->buffer_time / spec->latency_time;
435 if (spec->segtotal < 2) {
437 spec->buffer_time = spec->latency_time * spec->segtotal;
440 GST_DEBUG_OBJECT (sink, "buffer time: %" G_GINT64_FORMAT " usec",
442 GST_DEBUG_OBJECT (sink, "latency time: %" G_GINT64_FORMAT " usec",
444 GST_DEBUG_OBJECT (sink, "buffer_size %d, segsize %d, segtotal %d",
445 buffer_size, spec->segsize, spec->segtotal);
447 /* allocate the ringbuffer memory now */
448 buf->size = spec->segtotal * spec->segsize;
449 buf->memory = g_malloc0 (buf->size);
451 if ((res = gst_jack_audio_client_set_active (sink->client, TRUE)))
452 goto could_not_activate;
454 /* if we need to automatically connect the ports, do so now. We must do this
455 * after activating the client. */
456 if (sink->connect == GST_JACK_CONNECT_AUTO
457 || sink->connect == GST_JACK_CONNECT_AUTO_FORCED) {
458 /* find all the physical input ports. A physical input port is a port
459 * associated with a hardware device. Someone needs connect to a physical
460 * port in order to hear something. */
461 if (sink->port_pattern == NULL) {
462 ports = jack_get_ports (client, NULL, NULL,
463 JackPortIsPhysical | JackPortIsInput);
465 ports = jack_get_ports (client, sink->port_pattern, NULL,
469 /* no ports? fine then we don't do anything except for posting a warning
471 GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL),
472 ("No physical input ports found, leaving ports unconnected"));
476 for (i = 0; i < channels; i++) {
477 /* stop when all input ports are exhausted */
478 if (ports[i] == NULL) {
479 /* post a warning that we could not connect all ports */
480 GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL),
481 ("No more physical ports, leaving some ports unconnected"));
484 GST_DEBUG_OBJECT (sink, "try connecting to %s",
485 jack_port_name (sink->ports[i]));
486 /* connect the port to a physical port */
487 res = jack_connect (client, jack_port_name (sink->ports[i]), ports[i]);
488 if (res != 0 && res != EEXIST)
495 abuf->sample_rate = sample_rate;
496 abuf->buffer_size = buffer_size;
497 abuf->channels = channels;
504 GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
505 ("Wrong samplerate, server is running at %d and we received %d",
511 GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
512 ("Cannot allocate more Jack ports"));
517 GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
518 ("Could not activate client (%d:%s)", res, g_strerror (res)));
523 GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
524 ("Could not connect output ports to physical ports (%d:%s)",
525 res, g_strerror (res)));
531 /* function is called with LOCK */
533 gst_jack_ring_buffer_release (GstAudioRingBuffer * buf)
535 GstJackAudioSink *sink;
536 GstJackRingBuffer *abuf;
539 abuf = GST_JACK_RING_BUFFER_CAST (buf);
540 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
542 GST_DEBUG_OBJECT (sink, "release");
544 if ((res = gst_jack_audio_client_set_active (sink->client, FALSE))) {
545 /* we only warn, this means the server is probably shut down and the client
547 GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
548 ("Could not deactivate Jack client (%d)", res));
552 abuf->buffer_size = -1;
553 abuf->sample_rate = -1;
555 /* free the buffer */
556 g_free (buf->memory);
563 gst_jack_ring_buffer_start (GstAudioRingBuffer * buf)
565 GstJackAudioSink *sink;
567 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
569 GST_DEBUG_OBJECT (sink, "start");
571 if (sink->transport & GST_JACK_TRANSPORT_MASTER) {
572 jack_client_t *client;
574 client = gst_jack_audio_client_get_client (sink->client);
575 jack_transport_start (client);
582 gst_jack_ring_buffer_pause (GstAudioRingBuffer * buf)
584 GstJackAudioSink *sink;
586 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
588 GST_DEBUG_OBJECT (sink, "pause");
590 if (sink->transport & GST_JACK_TRANSPORT_MASTER) {
591 jack_client_t *client;
593 client = gst_jack_audio_client_get_client (sink->client);
594 jack_transport_stop (client);
601 gst_jack_ring_buffer_stop (GstAudioRingBuffer * buf)
603 GstJackAudioSink *sink;
605 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
607 GST_DEBUG_OBJECT (sink, "stop");
609 if (sink->transport & GST_JACK_TRANSPORT_MASTER) {
610 jack_client_t *client;
612 client = gst_jack_audio_client_get_client (sink->client);
613 jack_transport_stop (client);
619 #if defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)
621 gst_jack_ring_buffer_delay (GstAudioRingBuffer * buf)
623 GstJackAudioSink *sink;
625 jack_latency_range_t range;
627 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
629 for (i = 0; i < sink->port_count; i++) {
630 jack_port_get_latency_range (sink->ports[i], JackPlaybackLatency, &range);
635 GST_LOG_OBJECT (sink, "delay %u", res);
639 #else /* !(defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)) */
641 gst_jack_ring_buffer_delay (GstAudioRingBuffer * buf)
643 GstJackAudioSink *sink;
646 jack_client_t *client;
648 sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
649 client = gst_jack_audio_client_get_client (sink->client);
651 for (i = 0; i < sink->port_count; i++) {
652 latency = jack_port_get_total_latency (client, sink->ports[i]);
657 GST_LOG_OBJECT (sink, "delay %u", res);
663 static GstStaticPadTemplate jackaudiosink_sink_factory =
664 GST_STATIC_PAD_TEMPLATE ("sink",
667 GST_STATIC_CAPS ("audio/x-raw, "
668 "format = (string) " GST_JACK_FORMAT_STR ", "
669 "layout = (string) interleaved, "
670 "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
673 /* AudioSink signals and args */
680 #define DEFAULT_PROP_CONNECT GST_JACK_CONNECT_AUTO
681 #define DEFAULT_PROP_SERVER NULL
682 #define DEFAULT_PROP_CLIENT_NAME NULL
683 #define DEFAULT_PROP_PORT_PATTERN NULL
684 #define DEFAULT_PROP_TRANSPORT GST_JACK_TRANSPORT_AUTONOMOUS
698 #define gst_jack_audio_sink_parent_class parent_class
699 G_DEFINE_TYPE (GstJackAudioSink, gst_jack_audio_sink, GST_TYPE_AUDIO_BASE_SINK);
701 static void gst_jack_audio_sink_dispose (GObject * object);
702 static void gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
703 const GValue * value, GParamSpec * pspec);
704 static void gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
705 GValue * value, GParamSpec * pspec);
707 static GstCaps *gst_jack_audio_sink_getcaps (GstBaseSink * bsink,
709 static GstAudioRingBuffer
710 * gst_jack_audio_sink_create_ringbuffer (GstAudioBaseSink * sink);
713 gst_jack_audio_sink_class_init (GstJackAudioSinkClass * klass)
715 GObjectClass *gobject_class;
716 GstElementClass *gstelement_class;
717 GstBaseSinkClass *gstbasesink_class;
718 GstAudioBaseSinkClass *gstaudiobasesink_class;
720 GST_DEBUG_CATEGORY_INIT (gst_jack_audio_sink_debug, "jacksink", 0,
723 gobject_class = (GObjectClass *) klass;
724 gstelement_class = (GstElementClass *) klass;
725 gstbasesink_class = (GstBaseSinkClass *) klass;
726 gstaudiobasesink_class = (GstAudioBaseSinkClass *) klass;
728 gobject_class->dispose = gst_jack_audio_sink_dispose;
729 gobject_class->get_property = gst_jack_audio_sink_get_property;
730 gobject_class->set_property = gst_jack_audio_sink_set_property;
732 g_object_class_install_property (gobject_class, PROP_CONNECT,
733 g_param_spec_enum ("connect", "Connect",
734 "Specify how the output ports will be connected",
735 GST_TYPE_JACK_CONNECT, DEFAULT_PROP_CONNECT,
736 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
738 g_object_class_install_property (gobject_class, PROP_SERVER,
739 g_param_spec_string ("server", "Server",
740 "The Jack server to connect to (NULL = default)",
741 DEFAULT_PROP_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
744 * GstJackAudioSink:client-name:
746 * The client name to use.
748 g_object_class_install_property (gobject_class, PROP_CLIENT_NAME,
749 g_param_spec_string ("client-name", "Client name",
750 "The client name of the Jack instance (NULL = default)",
751 DEFAULT_PROP_CLIENT_NAME,
752 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
754 g_object_class_install_property (gobject_class, PROP_CLIENT,
755 g_param_spec_boxed ("client", "JackClient", "Handle for jack client",
756 GST_TYPE_JACK_CLIENT,
757 GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
758 G_PARAM_STATIC_STRINGS));
761 * GstJackAudioSink:port-pattern
763 * autoconnect to ports matching pattern, when NULL connect to physical ports
767 g_object_class_install_property (gobject_class, PROP_PORT_PATTERN,
768 g_param_spec_string ("port-pattern", "port pattern",
769 "A pattern to select which ports to connect to (NULL = first physical ports)",
770 DEFAULT_PROP_PORT_PATTERN,
771 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
774 * GstJackAudioSink:transport:
776 * The jack transport behaviour for the client.
778 g_object_class_install_property (gobject_class, PROP_TRANSPORT,
779 g_param_spec_flags ("transport", "Transport mode",
780 "Jack transport behaviour of the client",
781 GST_TYPE_JACK_TRANSPORT, DEFAULT_PROP_TRANSPORT,
782 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
784 gst_element_class_set_static_metadata (gstelement_class, "Audio Sink (Jack)",
785 "Sink/Audio", "Output audio to a JACK server",
786 "Wim Taymans <wim.taymans@gmail.com>");
788 gst_element_class_add_pad_template (gstelement_class,
789 gst_static_pad_template_get (&jackaudiosink_sink_factory));
791 gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_sink_getcaps);
793 gstaudiobasesink_class->create_ringbuffer =
794 GST_DEBUG_FUNCPTR (gst_jack_audio_sink_create_ringbuffer);
796 /* ref class from a thread-safe context to work around missing bit of
797 * thread-safety in GObject */
798 g_type_class_ref (GST_TYPE_JACK_RING_BUFFER);
800 gst_jack_audio_client_init ();
804 gst_jack_audio_sink_init (GstJackAudioSink * sink)
806 sink->connect = DEFAULT_PROP_CONNECT;
807 sink->server = g_strdup (DEFAULT_PROP_SERVER);
808 sink->jclient = NULL;
810 sink->port_count = 0;
811 sink->buffers = NULL;
812 sink->client_name = g_strdup (DEFAULT_PROP_CLIENT_NAME);
813 sink->transport = DEFAULT_PROP_TRANSPORT;
817 gst_jack_audio_sink_dispose (GObject * object)
819 GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (object);
821 gst_caps_replace (&sink->caps, NULL);
823 if (sink->client_name != NULL) {
824 g_free (sink->client_name);
825 sink->client_name = NULL;
828 if (sink->port_pattern != NULL) {
829 g_free (sink->port_pattern);
830 sink->port_pattern = NULL;
833 G_OBJECT_CLASS (parent_class)->dispose (object);
837 gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
838 const GValue * value, GParamSpec * pspec)
840 GstJackAudioSink *sink;
842 sink = GST_JACK_AUDIO_SINK (object);
845 case PROP_CLIENT_NAME:
846 g_free (sink->client_name);
847 sink->client_name = g_value_dup_string (value);
849 case PROP_PORT_PATTERN:
850 g_free (sink->port_pattern);
851 sink->port_pattern = g_value_dup_string (value);
854 sink->connect = g_value_get_enum (value);
857 g_free (sink->server);
858 sink->server = g_value_dup_string (value);
861 if (GST_STATE (sink) == GST_STATE_NULL ||
862 GST_STATE (sink) == GST_STATE_READY) {
863 sink->jclient = g_value_get_boxed (value);
867 sink->transport = g_value_get_flags (value);
870 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
876 gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
877 GValue * value, GParamSpec * pspec)
879 GstJackAudioSink *sink;
881 sink = GST_JACK_AUDIO_SINK (object);
884 case PROP_CLIENT_NAME:
885 g_value_set_string (value, sink->client_name);
887 case PROP_PORT_PATTERN:
888 g_value_set_string (value, sink->port_pattern);
891 g_value_set_enum (value, sink->connect);
894 g_value_set_string (value, sink->server);
897 g_value_set_boxed (value, sink->jclient);
900 g_value_set_flags (value, sink->transport);
903 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
909 gst_jack_audio_sink_getcaps (GstBaseSink * bsink, GstCaps * filter)
911 GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (bsink);
915 jack_client_t *client;
917 if (sink->client == NULL)
920 client = gst_jack_audio_client_get_client (sink->client);
922 if (sink->connect == GST_JACK_CONNECT_AUTO) {
923 /* get a port count, this is the number of channels we can automatically
925 ports = jack_get_ports (client, NULL, NULL,
926 JackPortIsPhysical | JackPortIsInput);
929 for (; ports[max]; max++);
934 /* we allow any number of pads, something else is going to connect the
940 rate = jack_get_sample_rate (client);
942 GST_DEBUG_OBJECT (sink, "got %d-%d ports, samplerate: %d", min, max, rate);
945 sink->caps = gst_caps_new_simple ("audio/x-raw",
946 "format", G_TYPE_STRING, GST_JACK_FORMAT_STR,
947 "layout", G_TYPE_STRING, "interleaved",
948 "rate", G_TYPE_INT, rate,
949 "channels", GST_TYPE_INT_RANGE, min, max, NULL);
951 GST_INFO_OBJECT (sink, "returning caps %" GST_PTR_FORMAT, sink->caps);
953 return gst_caps_ref (sink->caps);
958 GST_DEBUG_OBJECT (sink, "device not open, using template caps");
959 /* base class will get template caps for us when we return NULL */
964 static GstAudioRingBuffer *
965 gst_jack_audio_sink_create_ringbuffer (GstAudioBaseSink * sink)
967 GstAudioRingBuffer *buffer;
969 buffer = g_object_new (GST_TYPE_JACK_RING_BUFFER, NULL);
970 GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer);