Merge branch 'master' into 0.11
[platform/upstream/gstreamer.git] / ext / jack / gstjackaudiosink.c
1 /* GStreamer
2  * Copyright (C) 2006 Wim Taymans <wim@fluendo.com>
3  *
4  * gstjackaudiosink.c: jack audio sink implementation
5  *
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.
10  *
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.
15  *
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., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 /**
23  * SECTION:element-jackaudiosink
24  * @see_also: #GstBaseAudioSink, #GstRingBuffer
25  *
26  * A Sink that outputs data to Jack ports.
27  * 
28  * It will create N Jack ports named out_&lt;name&gt;_&lt;num&gt; where 
29  * &lt;name&gt; is the element name and &lt;num&gt; is starting from 1.
30  * Each port corresponds to a gstreamer channel.
31  * 
32  * The samplerate as exposed on the caps is always the same as the samplerate of
33  * the jack server.
34  * 
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
38  * caps.
39  * 
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.
43  * 
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.
47  * 
48  * <refsect2>
49  * <title>Example launch line</title>
50  * |[
51  * gst-launch audiotestsrc ! jackaudiosink
52  * ]| Play a sine wave to using jack.
53  * </refsect2>
54  *
55  * Last reviewed on 2006-11-30 (0.10.4)
56  */
57
58 #ifdef HAVE_CONFIG_H
59 #include "config.h"
60 #endif
61
62 #include <gst/gst-i18n-plugin.h>
63 #include <stdlib.h>
64 #include <string.h>
65
66 #include "gstjackaudiosink.h"
67 #include "gstjackringbuffer.h"
68
69 GST_DEBUG_CATEGORY_STATIC (gst_jack_audio_sink_debug);
70 #define GST_CAT_DEFAULT gst_jack_audio_sink_debug
71
72 static gboolean
73 gst_jack_audio_sink_allocate_channels (GstJackAudioSink * sink, gint channels)
74 {
75   jack_client_t *client;
76
77   client = gst_jack_audio_client_get_client (sink->client);
78
79   /* remove ports we don't need */
80   while (sink->port_count > channels) {
81     jack_port_unregister (client, sink->ports[--sink->port_count]);
82   }
83
84   /* alloc enough output ports */
85   sink->ports = g_realloc (sink->ports, sizeof (jack_port_t *) * channels);
86   sink->buffers = g_realloc (sink->buffers, sizeof (sample_t *) * channels);
87
88   /* create an output port for each channel */
89   while (sink->port_count < channels) {
90     gchar *name;
91
92     /* port names start from 1 and are local to the element */
93     name =
94         g_strdup_printf ("out_%s_%d", GST_ELEMENT_NAME (sink),
95         sink->port_count + 1);
96     sink->ports[sink->port_count] =
97         jack_port_register (client, name, JACK_DEFAULT_AUDIO_TYPE,
98         JackPortIsOutput, 0);
99     if (sink->ports[sink->port_count] == NULL)
100       return FALSE;
101
102     sink->port_count++;
103
104     g_free (name);
105   }
106   return TRUE;
107 }
108
109 static void
110 gst_jack_audio_sink_free_channels (GstJackAudioSink * sink)
111 {
112   gint res, i = 0;
113   jack_client_t *client;
114
115   client = gst_jack_audio_client_get_client (sink->client);
116
117   /* get rid of all ports */
118   while (sink->port_count) {
119     GST_LOG_OBJECT (sink, "unregister port %d", i);
120     if ((res = jack_port_unregister (client, sink->ports[i++]))) {
121       GST_DEBUG_OBJECT (sink, "unregister of port failed (%d)", res);
122     }
123     sink->port_count--;
124   }
125   g_free (sink->ports);
126   sink->ports = NULL;
127   g_free (sink->buffers);
128   sink->buffers = NULL;
129 }
130
131 /* ringbuffer abstract base class */
132 static GType
133 gst_jack_ring_buffer_get_type (void)
134 {
135   static volatile gsize ringbuffer_type = 0;
136
137   if (g_once_init_enter (&ringbuffer_type)) {
138     static const GTypeInfo ringbuffer_info = {
139       sizeof (GstJackRingBufferClass),
140       NULL,
141       NULL,
142       (GClassInitFunc) gst_jack_ring_buffer_class_init,
143       NULL,
144       NULL,
145       sizeof (GstJackRingBuffer),
146       0,
147       (GInstanceInitFunc) gst_jack_ring_buffer_init,
148       NULL
149     };
150     GType tmp = g_type_register_static (GST_TYPE_RING_BUFFER,
151         "GstJackAudioSinkRingBuffer", &ringbuffer_info, 0);
152     g_once_init_leave (&ringbuffer_type, tmp);
153   }
154
155   return (GType) ringbuffer_type;
156 }
157
158 static void
159 gst_jack_ring_buffer_class_init (GstJackRingBufferClass * klass)
160 {
161   GstRingBufferClass *gstringbuffer_class;
162
163   gstringbuffer_class = (GstRingBufferClass *) klass;
164
165   ring_parent_class = g_type_class_peek_parent (klass);
166
167   gstringbuffer_class->open_device =
168       GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_open_device);
169   gstringbuffer_class->close_device =
170       GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_close_device);
171   gstringbuffer_class->acquire =
172       GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_acquire);
173   gstringbuffer_class->release =
174       GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_release);
175   gstringbuffer_class->start = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
176   gstringbuffer_class->pause = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_pause);
177   gstringbuffer_class->resume = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_start);
178   gstringbuffer_class->stop = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_stop);
179
180   gstringbuffer_class->delay = GST_DEBUG_FUNCPTR (gst_jack_ring_buffer_delay);
181 }
182
183 /* this is the callback of jack. This should RT-safe.
184  */
185 static int
186 jack_process_cb (jack_nframes_t nframes, void *arg)
187 {
188   GstJackAudioSink *sink;
189   GstRingBuffer *buf;
190   gint readseg, len;
191   guint8 *readptr;
192   gint i, j, flen, channels;
193   sample_t *data;
194
195   buf = GST_RING_BUFFER_CAST (arg);
196   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
197
198   channels = GST_AUDIO_INFO_CHANNELS (&buf->spec.info);
199
200   /* get target buffers */
201   for (i = 0; i < channels; i++) {
202     sink->buffers[i] =
203         (sample_t *) jack_port_get_buffer (sink->ports[i], nframes);
204   }
205
206   if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
207     flen = len / channels;
208
209     /* the number of samples must be exactly the segment size */
210     if (nframes * sizeof (sample_t) != flen)
211       goto wrong_size;
212
213     GST_DEBUG_OBJECT (sink, "copy %d frames: %p, %d bytes, %d channels",
214         nframes, readptr, flen, channels);
215     data = (sample_t *) readptr;
216
217     /* the samples in the ringbuffer have the channels interleaved, we need to
218      * deinterleave into the jack target buffers */
219     for (i = 0; i < nframes; i++) {
220       for (j = 0; j < channels; j++) {
221         sink->buffers[j][i] = *data++;
222       }
223     }
224
225     /* clear written samples in the ringbuffer */
226     gst_ring_buffer_clear (buf, readseg);
227
228     /* we wrote one segment */
229     gst_ring_buffer_advance (buf, 1);
230   } else {
231     GST_DEBUG_OBJECT (sink, "write %d frames silence", nframes);
232     /* We are not allowed to read from the ringbuffer, write silence to all
233      * jack output buffers */
234     for (i = 0; i < channels; i++) {
235       memset (sink->buffers[i], 0, nframes * sizeof (sample_t));
236     }
237   }
238   return 0;
239
240   /* ERRORS */
241 wrong_size:
242   {
243     GST_ERROR_OBJECT (sink, "nbytes (%d) != flen (%d)",
244         (gint) (nframes * sizeof (sample_t)), flen);
245     return 1;
246   }
247 }
248
249 /* we error out */
250 static int
251 jack_sample_rate_cb (jack_nframes_t nframes, void *arg)
252 {
253   GstJackAudioSink *sink;
254   GstJackRingBuffer *abuf;
255
256   abuf = GST_JACK_RING_BUFFER_CAST (arg);
257   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
258
259   if (abuf->sample_rate != -1 && abuf->sample_rate != nframes)
260     goto not_supported;
261
262   return 0;
263
264   /* ERRORS */
265 not_supported:
266   {
267     GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS,
268         (NULL), ("Jack changed the sample rate, which is not supported"));
269     return 1;
270   }
271 }
272
273 /* we error out */
274 static int
275 jack_buffer_size_cb (jack_nframes_t nframes, void *arg)
276 {
277   GstJackAudioSink *sink;
278   GstJackRingBuffer *abuf;
279
280   abuf = GST_JACK_RING_BUFFER_CAST (arg);
281   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
282
283   if (abuf->buffer_size != -1 && abuf->buffer_size != nframes)
284     goto not_supported;
285
286   return 0;
287
288   /* ERRORS */
289 not_supported:
290   {
291     GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS,
292         (NULL), ("Jack changed the buffer size, which is not supported"));
293     return 1;
294   }
295 }
296
297 static void
298 jack_shutdown_cb (void *arg)
299 {
300   GstJackAudioSink *sink;
301
302   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (arg));
303
304   GST_DEBUG_OBJECT (sink, "shutdown");
305
306   GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
307       (NULL), ("Jack server shutdown"));
308 }
309
310 static void
311 gst_jack_ring_buffer_init (GstJackRingBuffer * buf,
312     GstJackRingBufferClass * g_class)
313 {
314   buf->channels = -1;
315   buf->buffer_size = -1;
316   buf->sample_rate = -1;
317 }
318
319 /* the _open_device method should make a connection with the server
320  */
321 static gboolean
322 gst_jack_ring_buffer_open_device (GstRingBuffer * buf)
323 {
324   GstJackAudioSink *sink;
325   jack_status_t status = 0;
326   const gchar *name;
327
328   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
329
330   GST_DEBUG_OBJECT (sink, "open");
331
332   name = g_get_application_name ();
333   if (!name)
334     name = "GStreamer";
335
336   sink->client = gst_jack_audio_client_new (name, sink->server,
337       sink->jclient,
338       GST_JACK_CLIENT_SINK,
339       jack_shutdown_cb,
340       jack_process_cb, jack_buffer_size_cb, jack_sample_rate_cb, buf, &status);
341   if (sink->client == NULL)
342     goto could_not_open;
343
344   GST_DEBUG_OBJECT (sink, "opened");
345
346   return TRUE;
347
348   /* ERRORS */
349 could_not_open:
350   {
351     if (status & JackServerFailed) {
352       GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND,
353           (_("Jack server not found")),
354           ("Cannot connect to the Jack server (status %d)", status));
355     } else {
356       GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE,
357           (NULL), ("Jack client open error (status %d)", status));
358     }
359     return FALSE;
360   }
361 }
362
363 /* close the connection with the server
364  */
365 static gboolean
366 gst_jack_ring_buffer_close_device (GstRingBuffer * buf)
367 {
368   GstJackAudioSink *sink;
369
370   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
371
372   GST_DEBUG_OBJECT (sink, "close");
373
374   gst_jack_audio_sink_free_channels (sink);
375   gst_jack_audio_client_free (sink->client);
376   sink->client = NULL;
377
378   return TRUE;
379 }
380
381 /* allocate a buffer and setup resources to process the audio samples of
382  * the format as specified in @spec.
383  *
384  * We allocate N jack ports, one for each channel. If we are asked to
385  * automatically make a connection with physical ports, we connect as many
386  * ports as there are physical ports, leaving leftover ports unconnected.
387  *
388  * It is assumed that samplerate and number of channels are acceptable since our
389  * getcaps method will always provide correct values. If unacceptable caps are
390  * received for some reason, we fail here.
391  */
392 static gboolean
393 gst_jack_ring_buffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
394 {
395   GstJackAudioSink *sink;
396   GstJackRingBuffer *abuf;
397   const char **ports;
398   gint sample_rate, buffer_size;
399   gint i, rate, bpf, channels, res;
400   jack_client_t *client;
401
402   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
403   abuf = GST_JACK_RING_BUFFER_CAST (buf);
404
405   GST_DEBUG_OBJECT (sink, "acquire");
406
407   client = gst_jack_audio_client_get_client (sink->client);
408
409   rate = GST_AUDIO_INFO_RATE (&spec->info);
410
411   /* sample rate must be that of the server */
412   sample_rate = jack_get_sample_rate (client);
413   if (sample_rate != rate)
414     goto wrong_samplerate;
415
416   channels = GST_AUDIO_INFO_CHANNELS (&spec->info);
417   bpf = GST_AUDIO_INFO_BPF (&spec->info);
418
419   if (!gst_jack_audio_sink_allocate_channels (sink, channels))
420     goto out_of_ports;
421
422   buffer_size = jack_get_buffer_size (client);
423
424   /* the segment size in bytes, this is large enough to hold a buffer of 32bit floats
425    * for all channels  */
426   spec->segsize = buffer_size * sizeof (gfloat) * channels;
427   spec->latency_time = gst_util_uint64_scale (spec->segsize,
428       (GST_SECOND / GST_USECOND), rate * bpf);
429   /* segtotal based on buffer-time latency */
430   spec->segtotal = spec->buffer_time / spec->latency_time;
431   if (spec->segtotal < 2) {
432     spec->segtotal = 2;
433     spec->buffer_time = spec->latency_time * spec->segtotal;
434   }
435
436   GST_DEBUG_OBJECT (sink, "buffer time: %" G_GINT64_FORMAT " usec",
437       spec->buffer_time);
438   GST_DEBUG_OBJECT (sink, "latency time: %" G_GINT64_FORMAT " usec",
439       spec->latency_time);
440   GST_DEBUG_OBJECT (sink, "buffer_size %d, segsize %d, segtotal %d",
441       buffer_size, spec->segsize, spec->segtotal);
442
443   /* allocate the ringbuffer memory now */
444   buf->size = spec->segtotal * spec->segsize;
445   buf->memory = g_malloc0 (buf->size);
446
447   if ((res = gst_jack_audio_client_set_active (sink->client, TRUE)))
448     goto could_not_activate;
449
450   /* if we need to automatically connect the ports, do so now. We must do this
451    * after activating the client. */
452   if (sink->connect == GST_JACK_CONNECT_AUTO
453       || sink->connect == GST_JACK_CONNECT_AUTO_FORCED) {
454     /* find all the physical input ports. A physical input port is a port
455      * associated with a hardware device. Someone needs connect to a physical
456      * port in order to hear something. */
457     ports = jack_get_ports (client, NULL, NULL,
458         JackPortIsPhysical | JackPortIsInput);
459     if (ports == NULL) {
460       /* no ports? fine then we don't do anything except for posting a warning
461        * message. */
462       GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL),
463           ("No physical input ports found, leaving ports unconnected"));
464       goto done;
465     }
466
467     for (i = 0; i < channels; i++) {
468       /* stop when all input ports are exhausted */
469       if (ports[i] == NULL) {
470         /* post a warning that we could not connect all ports */
471         GST_ELEMENT_WARNING (sink, RESOURCE, NOT_FOUND, (NULL),
472             ("No more physical ports, leaving some ports unconnected"));
473         break;
474       }
475       GST_DEBUG_OBJECT (sink, "try connecting to %s",
476           jack_port_name (sink->ports[i]));
477       /* connect the port to a physical port */
478       res = jack_connect (client, jack_port_name (sink->ports[i]), ports[i]);
479       if (res != 0 && res != EEXIST)
480         goto cannot_connect;
481     }
482     free (ports);
483   }
484 done:
485
486   abuf->sample_rate = sample_rate;
487   abuf->buffer_size = buffer_size;
488   abuf->channels = channels;
489
490   return TRUE;
491
492   /* ERRORS */
493 wrong_samplerate:
494   {
495     GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
496         ("Wrong samplerate, server is running at %d and we received %d",
497             sample_rate, rate));
498     return FALSE;
499   }
500 out_of_ports:
501   {
502     GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
503         ("Cannot allocate more Jack ports"));
504     return FALSE;
505   }
506 could_not_activate:
507   {
508     GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
509         ("Could not activate client (%d:%s)", res, g_strerror (res)));
510     return FALSE;
511   }
512 cannot_connect:
513   {
514     GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL),
515         ("Could not connect output ports to physical ports (%d:%s)",
516             res, g_strerror (res)));
517     free (ports);
518     return FALSE;
519   }
520 }
521
522 /* function is called with LOCK */
523 static gboolean
524 gst_jack_ring_buffer_release (GstRingBuffer * buf)
525 {
526   GstJackAudioSink *sink;
527   GstJackRingBuffer *abuf;
528   gint res;
529
530   abuf = GST_JACK_RING_BUFFER_CAST (buf);
531   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
532
533   GST_DEBUG_OBJECT (sink, "release");
534
535   if ((res = gst_jack_audio_client_set_active (sink->client, FALSE))) {
536     /* we only warn, this means the server is probably shut down and the client
537      * is gone anyway. */
538     GST_ELEMENT_WARNING (sink, RESOURCE, CLOSE, (NULL),
539         ("Could not deactivate Jack client (%d)", res));
540   }
541
542   abuf->channels = -1;
543   abuf->buffer_size = -1;
544   abuf->sample_rate = -1;
545
546   /* free the buffer */
547   g_free (buf->memory);
548   buf->memory = NULL;
549
550   return TRUE;
551 }
552
553 static gboolean
554 gst_jack_ring_buffer_start (GstRingBuffer * buf)
555 {
556   GstJackAudioSink *sink;
557
558   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
559
560   GST_DEBUG_OBJECT (sink, "start");
561
562   return TRUE;
563 }
564
565 static gboolean
566 gst_jack_ring_buffer_pause (GstRingBuffer * buf)
567 {
568   GstJackAudioSink *sink;
569
570   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
571
572   GST_DEBUG_OBJECT (sink, "pause");
573
574   return TRUE;
575 }
576
577 static gboolean
578 gst_jack_ring_buffer_stop (GstRingBuffer * buf)
579 {
580   GstJackAudioSink *sink;
581
582   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
583
584   GST_DEBUG_OBJECT (sink, "stop");
585
586   return TRUE;
587 }
588
589 #if defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)
590 static guint
591 gst_jack_ring_buffer_delay (GstRingBuffer * buf)
592 {
593   GstJackAudioSink *sink;
594   guint i, res = 0;
595   jack_latency_range_t range;
596
597   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
598
599   for (i = 0; i < sink->port_count; i++) {
600     jack_port_get_latency_range (sink->ports[i], JackPlaybackLatency, &range);
601     if (range.max > res)
602       res = range.max;
603   }
604
605   GST_LOG_OBJECT (sink, "delay %u", res);
606
607   return res;
608 }
609 #else /* !(defined (HAVE_JACK_0_120_1) || defined(HAVE_JACK_1_9_7)) */
610 static guint
611 gst_jack_ring_buffer_delay (GstRingBuffer * buf)
612 {
613   GstJackAudioSink *sink;
614   guint i, res = 0;
615   guint latency;
616   jack_client_t *client;
617
618   sink = GST_JACK_AUDIO_SINK (GST_OBJECT_PARENT (buf));
619   client = gst_jack_audio_client_get_client (sink->client);
620
621   for (i = 0; i < sink->port_count; i++) {
622     latency = jack_port_get_total_latency (client, sink->ports[i]);
623     if (latency > res)
624       res = latency;
625   }
626
627   GST_LOG_OBJECT (sink, "delay %u", res);
628
629   return res;
630 }
631 #endif
632
633 static GstStaticPadTemplate jackaudiosink_sink_factory =
634 GST_STATIC_PAD_TEMPLATE ("sink",
635     GST_PAD_SINK,
636     GST_PAD_ALWAYS,
637     GST_STATIC_CAPS ("audio/x-raw, "
638         "format = (string) " GST_JACK_FORMAT_STR ", "
639         "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]")
640     );
641
642 /* AudioSink signals and args */
643 enum
644 {
645   /* FILL ME */
646   SIGNAL_LAST
647 };
648
649 #define DEFAULT_PROP_CONNECT    GST_JACK_CONNECT_AUTO
650 #define DEFAULT_PROP_SERVER     NULL
651
652 enum
653 {
654   PROP_0,
655   PROP_CONNECT,
656   PROP_SERVER,
657   PROP_CLIENT,
658   PROP_LAST
659 };
660
661 #define gst_jack_audio_sink_parent_class parent_class
662 G_DEFINE_TYPE (GstJackAudioSink, gst_jack_audio_sink, GST_TYPE_BASE_AUDIO_SINK);
663
664 static void gst_jack_audio_sink_dispose (GObject * object);
665 static void gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
666     const GValue * value, GParamSpec * pspec);
667 static void gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
668     GValue * value, GParamSpec * pspec);
669
670 static GstCaps *gst_jack_audio_sink_getcaps (GstBaseSink * bsink,
671     GstCaps * filter);
672 static GstRingBuffer *gst_jack_audio_sink_create_ringbuffer (GstBaseAudioSink *
673     sink);
674
675 static void
676 gst_jack_audio_sink_class_init (GstJackAudioSinkClass * klass)
677 {
678   GObjectClass *gobject_class;
679   GstElementClass *gstelement_class;
680   GstBaseSinkClass *gstbasesink_class;
681   GstBaseAudioSinkClass *gstbaseaudiosink_class;
682
683   GST_DEBUG_CATEGORY_INIT (gst_jack_audio_sink_debug, "jacksink", 0,
684       "jacksink element");
685
686   gobject_class = (GObjectClass *) klass;
687   gstelement_class = (GstElementClass *) klass;
688   gstbasesink_class = (GstBaseSinkClass *) klass;
689   gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass;
690
691   gobject_class->dispose = gst_jack_audio_sink_dispose;
692   gobject_class->get_property = gst_jack_audio_sink_get_property;
693   gobject_class->set_property = gst_jack_audio_sink_set_property;
694
695   g_object_class_install_property (gobject_class, PROP_CONNECT,
696       g_param_spec_enum ("connect", "Connect",
697           "Specify how the output ports will be connected",
698           GST_TYPE_JACK_CONNECT, DEFAULT_PROP_CONNECT,
699           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
700
701   g_object_class_install_property (gobject_class, PROP_SERVER,
702       g_param_spec_string ("server", "Server",
703           "The Jack server to connect to (NULL = default)",
704           DEFAULT_PROP_SERVER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
705
706   g_object_class_install_property (gobject_class, PROP_CLIENT,
707       g_param_spec_boxed ("client", "JackClient", "Handle for jack client",
708           GST_TYPE_JACK_CLIENT,
709           GST_PARAM_MUTABLE_READY | G_PARAM_READWRITE |
710           G_PARAM_STATIC_STRINGS));
711
712   gst_element_class_set_details_simple (gstelement_class, "Audio Sink (Jack)",
713       "Sink/Audio", "Output audio to a JACK server",
714       "Wim Taymans <wim.taymans@gmail.com>");
715
716   gst_element_class_add_pad_template (gstelement_class,
717       gst_static_pad_template_get (&jackaudiosink_sink_factory));
718
719   gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_jack_audio_sink_getcaps);
720
721   gstbaseaudiosink_class->create_ringbuffer =
722       GST_DEBUG_FUNCPTR (gst_jack_audio_sink_create_ringbuffer);
723
724   /* ref class from a thread-safe context to work around missing bit of
725    * thread-safety in GObject */
726   g_type_class_ref (GST_TYPE_JACK_RING_BUFFER);
727
728   gst_jack_audio_client_init ();
729 }
730
731 static void
732 gst_jack_audio_sink_init (GstJackAudioSink * sink)
733 {
734   sink->connect = DEFAULT_PROP_CONNECT;
735   sink->server = g_strdup (DEFAULT_PROP_SERVER);
736   sink->jclient = NULL;
737   sink->ports = NULL;
738   sink->port_count = 0;
739   sink->buffers = NULL;
740 }
741
742 static void
743 gst_jack_audio_sink_dispose (GObject * object)
744 {
745   GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (object);
746
747   gst_caps_replace (&sink->caps, NULL);
748   G_OBJECT_CLASS (parent_class)->dispose (object);
749 }
750
751 static void
752 gst_jack_audio_sink_set_property (GObject * object, guint prop_id,
753     const GValue * value, GParamSpec * pspec)
754 {
755   GstJackAudioSink *sink;
756
757   sink = GST_JACK_AUDIO_SINK (object);
758
759   switch (prop_id) {
760     case PROP_CONNECT:
761       sink->connect = g_value_get_enum (value);
762       break;
763     case PROP_SERVER:
764       g_free (sink->server);
765       sink->server = g_value_dup_string (value);
766       break;
767     case PROP_CLIENT:
768       if (GST_STATE (sink) == GST_STATE_NULL ||
769           GST_STATE (sink) == GST_STATE_READY) {
770         sink->jclient = g_value_get_boxed (value);
771       }
772       break;
773     default:
774       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
775       break;
776   }
777 }
778
779 static void
780 gst_jack_audio_sink_get_property (GObject * object, guint prop_id,
781     GValue * value, GParamSpec * pspec)
782 {
783   GstJackAudioSink *sink;
784
785   sink = GST_JACK_AUDIO_SINK (object);
786
787   switch (prop_id) {
788     case PROP_CONNECT:
789       g_value_set_enum (value, sink->connect);
790       break;
791     case PROP_SERVER:
792       g_value_set_string (value, sink->server);
793       break;
794     case PROP_CLIENT:
795       g_value_set_boxed (value, sink->jclient);
796       break;
797     default:
798       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
799       break;
800   }
801 }
802
803 static GstCaps *
804 gst_jack_audio_sink_getcaps (GstBaseSink * bsink, GstCaps * filter)
805 {
806   GstJackAudioSink *sink = GST_JACK_AUDIO_SINK (bsink);
807   const char **ports;
808   gint min, max;
809   gint rate;
810   jack_client_t *client;
811
812   if (sink->client == NULL)
813     goto no_client;
814
815   client = gst_jack_audio_client_get_client (sink->client);
816
817   if (sink->connect == GST_JACK_CONNECT_AUTO) {
818     /* get a port count, this is the number of channels we can automatically
819      * connect. */
820     ports = jack_get_ports (client, NULL, NULL,
821         JackPortIsPhysical | JackPortIsInput);
822     max = 0;
823     if (ports != NULL) {
824       for (; ports[max]; max++);
825       free (ports);
826     } else
827       max = 0;
828   } else {
829     /* we allow any number of pads, something else is going to connect the
830      * pads. */
831     max = G_MAXINT;
832   }
833   min = MIN (1, max);
834
835   rate = jack_get_sample_rate (client);
836
837   GST_DEBUG_OBJECT (sink, "got %d-%d ports, samplerate: %d", min, max, rate);
838
839   if (!sink->caps) {
840     sink->caps = gst_caps_new_simple ("audio/x-raw",
841         "format", G_TYPE_STRING, GST_JACK_FORMAT_STR,
842         "rate", G_TYPE_INT, rate,
843         "channels", GST_TYPE_INT_RANGE, min, max, NULL);
844   }
845   GST_INFO_OBJECT (sink, "returning caps %" GST_PTR_FORMAT, sink->caps);
846
847   return gst_caps_ref (sink->caps);
848
849   /* ERRORS */
850 no_client:
851   {
852     GST_DEBUG_OBJECT (sink, "device not open, using template caps");
853     /* base class will get template caps for us when we return NULL */
854     return NULL;
855   }
856 }
857
858 static GstRingBuffer *
859 gst_jack_audio_sink_create_ringbuffer (GstBaseAudioSink * sink)
860 {
861   GstRingBuffer *buffer;
862
863   buffer = g_object_new (GST_TYPE_JACK_RING_BUFFER, NULL);
864   GST_DEBUG_OBJECT (sink, "created ringbuffer @%p", buffer);
865
866   return buffer;
867 }