On Tue, Oct 28, 2008 at 03:31:38AM +0000, Jacob Meuser wrote: > > this adds playback and recording backends using libsndio. gstreamer > will use them by default.
any objections to this going in? > please test with any and all ports that use gstreamer for audio i/o. > I only use this with gnash. grepping ports/INDEX suggests these: > > rhythmbox-0.11.5 > subtitleeditor-0.13.6p1 > gcompris-8.4.4p2 > swfdec-0.6.8 > py-gstreamer-0.10.11p0 > oggconvert-0.3.0 > emesene-1.0 > farsight-0.1.25p2 > gnash-0.8.3p1 > gnome-applets2-2.20.0p5 > gnomebaker-0.6.4 > control-center2-2.20.3p6 > gnome-media-2.20.1p4 > totem-2.22.2p2 > kdemultimedia-3.5.10 > > patch also available at > http://jakemsr.trancell.org/plugins-good-libsndio.diff > > if this works for people, I suggest removing the patches/modules for > OSS and audio(4) and quit trying to maintain them ... same for SDL. > > and I will of course push this upstream if people like it. > > -- > [EMAIL PROTECTED] > SDF Public Access UNIX System - http://sdf.lonestar.org > > Index: Makefile > =================================================================== > RCS file: > /home2/cvs/OpenBSD/ports/multimedia/gstreamer-0.10/plugins-good/Makefile,v > retrieving revision 1.24 > diff -u -r1.24 Makefile > --- Makefile 24 Sep 2008 23:01:32 -0000 1.24 > +++ Makefile 28 Oct 2008 03:09:03 -0000 > @@ -18,7 +18,7 @@ > > V = 0.10.8 > DISTNAME = gst-plugins-good-$V > -PKGNAME-main = gstreamer-plugins-good-$Vp4 > +PKGNAME-main = gstreamer-plugins-good-$Vp5 > PKGNAME-aalib = gstreamer-aalib-$Vp0 > PKGNAME-cairo = gstreamer-cairo-$Vp1 > PKGNAME-gconf = gstreamer-confelements-$Vp0 > @@ -50,7 +50,7 @@ > LIB_DEPENDS = gstreamer-0.10:gstreamer->=0.10:$P/core > > WANTLIB-main = ${WANTLIB} \ > - ICE SM X11 Xdamage Xext Xfixes ossaudio \ > + ICE SM X11 Xdamage Xext Xfixes ossaudio sndio \ > gstcontroller-0.10 gstbase-0.10 Xau Xdmcp > LIB_DEPENDS-main = ${LIB_DEPENDS} \ > oil-0.3::devel/liboil \ > @@ -148,6 +148,10 @@ > LIB_DEPENDS-soup = ${LIB_DEPENDS} \ > soup-2.4::devel/libsoup > > +BUILD_DEPENDS += ${MODGNU_AUTOCONF_DEPENDS} \ > + ${MODGNU_AUTOMAKE_DEPENDS} > +AUTOMAKE_VERSION = 1.9 > +CONFIGURE_STYLE = gnu > CONFIGURE_ARGS += --with-aalib-prefix=${LOCALBASE} \ > --disable-cdio \ > --disable-dv1394 \ > @@ -156,9 +160,16 @@ > --disable-schemas-install \ > --enable-experimental \ > --enable-gst_v4l2 \ > - --with-default-audiosink=osssink \ > - --with-default-audiosrc=osssrc \ > + --with-default-audiosink=libsndiosink \ > + --with-default-audiosrc=libsndiosrc \ > --with-default-videosink=xvimagesink \ > --with-default-videosrc=v4l2src > + > +post-extract: > + cp -R ${FILESDIR} ${WRKSRC}/ext/libsndio > + > +pre-configure: > + cd ${WRKSRC} && AUTOCONF_VERSION=${AUTOCONF_VERSION} \ > + AUTOMAKE_VERSION=${AUTOMAKE_VERSION} NOCONFIGURE="true" > ./autogen.sh > > .include <bsd.port.mk> > Index: files/Makefile.am > =================================================================== > RCS file: files/Makefile.am > diff -N files/Makefile.am > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ files/Makefile.am 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,11 @@ > +plugin_LTLIBRARIES = libgstlibsndio.la > + > +libgstlibsndio_la_SOURCES = gstlibsndio.c libsndiosink.c libsndiosrc.c > +libgstlibsndio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) > +libgstlibsndio_la_LIBADD = \ > + $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_MAJORMINOR) \ > + $(LIBSNDIO_LIBS) > +libgstlibsndio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) > + > +noinst_HEADERS = libsndiosink.h libsndiosrc.h > +EXTRA_DIST = > Index: files/gstlibsndio.c > =================================================================== > RCS file: files/gstlibsndio.c > diff -N files/gstlibsndio.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ files/gstlibsndio.c 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,54 @@ > +/* GStreamer > + * Copyright (C) <2008> Jacob Meuser <[EMAIL PROTECTED]> > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Library General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Library General Public License for more details. > + * > + * You should have received a copy of the GNU Library General Public > + * License along with this library; if not, write to the > + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, > + * Boston, MA 02111-1307, USA. > + */ > + > +#ifdef HAVE_CONFIG_H > +#include "config.h" > +#endif > +#include "libsndiosink.h" > +#include "libsndiosrc.h" > + > +#include "gst/gst-i18n-plugin.h" > + > +GST_DEBUG_CATEGORY (libsndio_debug); > + > +static gboolean > +plugin_init (GstPlugin * plugin) > +{ > + if (!gst_element_register (plugin, "libsndiosrc", GST_RANK_PRIMARY, > + GST_TYPE_LIBSNDIOSRC) || > + !gst_element_register (plugin, "libsndiosink", GST_RANK_PRIMARY, > + GST_TYPE_LIBSNDIOSINK)) { > + return FALSE; > + } > + > + GST_DEBUG_CATEGORY_INIT (libsndio_debug, "libsndio", 0, "libsndio > elements"); > + > +#ifdef ENABLE_NLS > + setlocale (LC_ALL, ""); > + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); > +#endif /* ENABLE_NLS */ > + > + return TRUE; > +} > + > +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, > + GST_VERSION_MINOR, > + "libsndio", > + "libsndio support for GStreamer", > + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) > Index: files/libsndiosink.c > =================================================================== > RCS file: files/libsndiosink.c > diff -N files/libsndiosink.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ files/libsndiosink.c 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,536 @@ > +/* GStreamer > + * Copyright (C) <2008> Jacob Meuser <[EMAIL PROTECTED]> > + * > + * libsndiosink.c: libsndio audio sink > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Library General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Library General Public License for more details. > + * > + * You should have received a copy of the GNU Library General Public > + * License along with this library; if not, write to the > + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, > + * Boston, MA 02111-1307, USA. > + */ > + > +/** > + * SECTION:element-libsndiosink > + * @see_also: #GstAutoAudioSink > + * > + * <refsect2> > + * <para> > + * This element outputs sound to a sound card using libsndio. > + * </para> > + * <para> > + * Simple example pipeline that plays an Ogg/Vorbis file via libsndio: > + * <programlisting> > + * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! > audioresample ! libsndiosink > + * </programlisting> > + * </para> > + * </refsect2> > + */ > + > +#ifdef HAVE_CONFIG_H > +#include "config.h" > +#endif > + > +#include "libsndiosink.h" > +#include <unistd.h> > +#include <errno.h> > + > +#include <gst/gst-i18n-plugin.h> > + > +GST_DEBUG_CATEGORY_EXTERN (libsndio_debug); > +#define GST_CAT_DEFAULT libsndio_debug > + > +/* elementfactory information */ > +static const GstElementDetails libsndiosink_details = > +GST_ELEMENT_DETAILS ("Libsndio audio sink", > + "Sink/Audio", > + "Plays audio through libsndio", > + "Jacob Meuser <[EMAIL PROTECTED]>"); > + > +enum > +{ > + PROP_0, > + PROP_HOST > +}; > + > +static GstStaticPadTemplate libsndio_sink_factory = > + GST_STATIC_PAD_TEMPLATE ("sink", > + GST_PAD_SINK, > + GST_PAD_ALWAYS, > + GST_STATIC_CAPS ("audio/x-raw-int, " > + "endianness = (int) { 1234, 4321 }, " > + "signed = (boolean) { TRUE, FALSE }, " > + "width = (int) { 8, 16, 24, 32 }, " > + "depth = (int) { 8, 16, 24, 32 }, " > + "rate = (int) [ 8000, 192000 ], " > + "channels = (int) [ 1, 16 ] ") > + ); > + > +static void gst_libsndiosink_finalize (GObject * object); > + > +static GstCaps *gst_libsndiosink_getcaps (GstBaseSink * bsink); > + > +static gboolean gst_libsndiosink_open (GstAudioSink * asink); > +static gboolean gst_libsndiosink_close (GstAudioSink * asink); > +static gboolean gst_libsndiosink_prepare (GstAudioSink * asink, > + GstRingBufferSpec * spec); > +static gboolean gst_libsndiosink_unprepare (GstAudioSink * asink); > +static guint gst_libsndiosink_write (GstAudioSink * asink, gpointer data, > + guint length); > +static guint gst_libsndiosink_delay (GstAudioSink * asink); > +static void gst_libsndiosink_reset (GstAudioSink * asink); > + > +static void gst_libsndiosink_set_property (GObject * object, guint prop_id, > + const GValue * value, GParamSpec * pspec); > +static void gst_libsndiosink_get_property (GObject * object, guint prop_id, > + GValue * value, GParamSpec * pspec); > +static void gst_libsndiosink_cb(void * addr, int delta); > + > +GST_BOILERPLATE (GstLibsndioSink, gst_libsndiosink, GstAudioSink, > GST_TYPE_AUDIO_SINK); > + > +static void > +gst_libsndiosink_base_init (gpointer g_class) > +{ > + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); > + > + gst_element_class_set_details (element_class, &libsndiosink_details); > + > + gst_element_class_add_pad_template (element_class, > + gst_static_pad_template_get (&libsndio_sink_factory)); > +} > + > +static void > +gst_libsndiosink_class_init (GstLibsndioSinkClass * klass) > +{ > + GObjectClass *gobject_class; > + GstBaseSinkClass *gstbasesink_class; > + GstBaseAudioSinkClass *gstbaseaudiosink_class; > + GstAudioSinkClass *gstaudiosink_class; > + > + gobject_class = (GObjectClass *) klass; > + gstbasesink_class = (GstBaseSinkClass *) klass; > + gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass; > + gstaudiosink_class = (GstAudioSinkClass *) klass; > + > + parent_class = g_type_class_peek_parent (klass); > + > + gobject_class->finalize = gst_libsndiosink_finalize; > + > + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_libsndiosink_getcaps); > + > + gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_libsndiosink_open); > + gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_libsndiosink_close); > + gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_libsndiosink_prepare); > + gstaudiosink_class->unprepare = GST_DEBUG_FUNCPTR > (gst_libsndiosink_unprepare); > + gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_libsndiosink_write); > + gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_libsndiosink_delay); > + gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_libsndiosink_reset); > + > + gobject_class->set_property = gst_libsndiosink_set_property; > + gobject_class->get_property = gst_libsndiosink_get_property; > + > + /* default value is filled in the _init method */ > + g_object_class_install_property (gobject_class, PROP_HOST, > + g_param_spec_string ("host", "Host", > + "Device or socket libsndio will access", NULL, G_PARAM_READWRITE)); > +} > + > +static void > +gst_libsndiosink_init (GstLibsndioSink * libsndiosink, GstLibsndioSinkClass > * klass) > +{ > + libsndiosink->hdl = NULL; > + libsndiosink->host = g_strdup (g_getenv ("AUDIODEVICE")); > +} > + > +static void > +gst_libsndiosink_finalize (GObject * object) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (object); > + > + gst_caps_replace (&libsndiosink->cur_caps, NULL); > + g_free (libsndiosink->host); > + > + G_OBJECT_CLASS (parent_class)->finalize (object); > +} > + > +static GstCaps * > +gst_libsndiosink_getcaps (GstBaseSink * bsink) > +{ > + GstLibsndioSink *libsndiosink; > + > + libsndiosink = GST_LIBSNDIOSINK (bsink); > + > + /* no hdl, we're done with the template caps */ > + if (libsndiosink->cur_caps == NULL) { > + GST_LOG_OBJECT (libsndiosink, "getcaps called, returning template caps"); > + return NULL; > + } > + > + GST_LOG_OBJECT (libsndiosink, "returning %" GST_PTR_FORMAT, > libsndiosink->cur_caps); > + > + return gst_caps_ref (libsndiosink->cur_caps); > +} > + > +static gboolean > +gst_libsndiosink_open (GstAudioSink * asink) > +{ > + GstPadTemplate *pad_template; > + GstLibsndioSink *libsndiosink; > + struct sio_par par; > + struct sio_cap cap; > + GArray *rates, *chans; > + GValue rates_v = { 0 }; > + GValue chans_v = { 0 }; > + GValue value = { 0 }; > + struct sio_enc enc; > + struct sio_conf conf; > + int confs[SIO_NCONF]; > + int rate, chan; > + int i, j, k; > + int nconfs; > + > + > + libsndiosink = GST_LIBSNDIOSINK (asink); > + > + GST_DEBUG_OBJECT (libsndiosink, "open"); > + > + /* conect */ > + libsndiosink->hdl = sio_open (libsndiosink->host, SIO_PLAY, 0); > + > + if (libsndiosink->hdl == NULL) > + goto couldnt_connect; > + > + /* Use libsndio defaults as the only encodings, but get the supported > + * sample rates and number of channels. > + */ > + > + if (!sio_getpar(libsndiosink->hdl, &par)) > + goto no_server_info; > + > + if (!sio_getcap(libsndiosink->hdl, &cap)) > + goto no_server_info; > + > + rates = g_array_new(FALSE, FALSE, sizeof(int)); > + chans = g_array_new(FALSE, FALSE, sizeof(int)); > + > + /* find confs that have the default encoding */ > + nconfs = 0; > + for (i = 0; i < cap.nconf; i++) { > + for (j = 0; j < SIO_NENC; j++) { > + if (cap.confs[i].enc & (1 << j)) { > + enc = cap.enc[j]; > + if (enc.bits == par.bits && enc.sig == par.sig && enc.le == par.le) { > + confs[nconfs] = i; > + nconfs++; > + break; > + } > + } > + } > + } > + > + /* find the rates and channels of the confs that have the default encoding > */ > + for (i = 0; i < nconfs; i++) { > + conf = cap.confs[confs[i]]; > + /* rates */ > + for (j = 0; j < SIO_NRATE; j++) { > + if (conf.rate & (1 << j)) { > + rate = cap.rate[j]; > + for (k = 0; k < rates->len && rate; k++) { > + if (rate == g_array_index(rates, int, k)) > + rate = 0; > + } > + /* add in ascending order */ > + if (rate) { > + for (k = 0; k < rates->len; k++) { > + if (rate < g_array_index(rates, int, k)) { > + g_array_insert_val(rates, k, rate); > + break; > + } > + } > + if (k == rates->len) > + g_array_append_val(rates, rate); > + } > + } > + } > + /* channels */ > + for (j = 0; j < SIO_NCHAN; j++) { > + if (conf.pchan & (1 << j)) { > + chan = cap.pchan[j]; > + for (k = 0; k < chans->len && chan; k++) { > + if (chan == g_array_index(chans, int, k)) > + chan = 0; > + } > + /* add in ascending order */ > + if (chan) { > + for (k = 0; k < chans->len; k++) { > + if (chan < g_array_index(chans, int, k)) { > + g_array_insert_val(chans, k, chan); > + break; > + } > + } > + if (k == chans->len) > + g_array_append_val(chans, chan); > + } > + } > + } > + } > + /* not sure how this can happen, but it might */ > + if (cap.nconf == 0) { > + g_array_append_val(rates, par.rate); > + g_array_append_val(chans, par.pchan); > + } > + > + g_value_init(&rates_v, GST_TYPE_LIST); > + g_value_init(&chans_v, GST_TYPE_LIST); > + g_value_init(&value, G_TYPE_INT); > + > + for (i = 0; i < rates->len; i++) { > + g_value_set_int(&value, g_array_index(rates, int, i)); > + gst_value_list_append_value(&rates_v, &value); > + } > + for (i = 0; i < chans->len; i++) { > + g_value_set_int(&value, g_array_index(chans, int, i)); > + gst_value_list_append_value(&chans_v, &value); > + } > + > + g_array_free(rates, TRUE); > + g_array_free(chans, TRUE); > + > + pad_template = gst_static_pad_template_get (&libsndio_sink_factory); > + libsndiosink->cur_caps = gst_caps_copy (gst_pad_template_get_caps > (pad_template)); > + gst_object_unref (pad_template); > + > + for (i = 0; i < libsndiosink->cur_caps->structs->len; i++) { > + GstStructure *s; > + > + s = gst_caps_get_structure (libsndiosink->cur_caps, i); > + gst_structure_set (s, "endianness", G_TYPE_INT, par.le ? 1234 : 4321, > NULL); > + gst_structure_set (s, "signed", G_TYPE_BOOLEAN, par.sig ? TRUE : FALSE, > NULL); > + gst_structure_set (s, "width", G_TYPE_INT, par.bits, NULL); > + // gst_structure_set (s, "depth", G_TYPE_INT, par.bps * 8, NULL); /* XXX > */ > + gst_structure_set_value (s, "rate", &rates_v); > + gst_structure_set_value (s, "channels", &chans_v); > + } > + > + return TRUE; > + > + /* ERRORS */ > +couldnt_connect: > + { > + GST_ELEMENT_ERROR (libsndiosink, RESOURCE, OPEN_WRITE, > + (_("Could not establish connection to libsndio")), > + ("can't open connection to libsndio")); > + return FALSE; > + } > +no_server_info: > + { > + GST_ELEMENT_ERROR (libsndiosink, RESOURCE, OPEN_WRITE, > + (_("Failed to query libsndio capabilities")), > + ("couldn't get libsndio info!")); > + return FALSE; > + } > +} > + > +static gboolean > +gst_libsndiosink_close (GstAudioSink * asink) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (asink); > + > + GST_DEBUG_OBJECT (libsndiosink, "close"); > + > + gst_caps_replace (&libsndiosink->cur_caps, NULL); > + sio_close (libsndiosink->hdl); > + libsndiosink->hdl = NULL; > + > + return TRUE; > +} > + > +static void > +gst_libsndiosink_cb(void *addr, int delta) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK ((GstAudioSink *)addr); > + > + libsndiosink->realpos += delta; > + > + if (libsndiosink->realpos >= libsndiosink->playpos) > + libsndiosink->latency = 0; > + else > + libsndiosink->latency = libsndiosink->playpos - libsndiosink->realpos; > +} > + > +static gboolean > +gst_libsndiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (asink); > + struct sio_par par; > + int spec_bpf; > + > + GST_DEBUG_OBJECT (libsndiosink, "prepare"); > + > + libsndiosink->playpos = libsndiosink->realpos = libsndiosink->latency = 0; > + > + sio_initpar(&par); > + par.sig = spec->sign; > + par.le = !spec->bigend; > + par.bits = spec->width; > + // par.bps = spec->depth / 8; /* XXX */ > + par.rate = spec->rate; > + par.pchan = spec->channels; > + > + spec_bpf = ((spec->width / 8) * spec->channels); > + > + par.bufsz = (spec->segsize * spec->segtotal) / spec_bpf; > + > + if (!sio_setpar(libsndiosink->hdl, &par)) > + goto cannot_configure; > + > + sio_getpar(libsndiosink->hdl, &par); > + > + spec->sign = par.sig; > + spec->bigend = !par.le; > + spec->width = par.bits; > + // spec->depth = par.bps * 8; /* XXX */ > + spec->rate = par.rate; > + spec->channels = par.pchan; > + > + libsndiosink->bpf = par.bps * par.pchan; > + > + spec->segsize = par.round * par.pchan * par.bps; > + spec->segtotal = par.bufsz / par.round; > + > + /* FIXME: this is wrong for signed ints (and the > + * audioringbuffers should do it for us anyway) */ > + spec->silence_sample[0] = 0; > + spec->silence_sample[1] = 0; > + spec->silence_sample[2] = 0; > + spec->silence_sample[3] = 0; > + > + sio_onmove(libsndiosink->hdl, gst_libsndiosink_cb, libsndiosink); > + > + if (!sio_start(libsndiosink->hdl)) > + goto cannot_start; > + > + GST_INFO_OBJECT (libsndiosink, "successfully opened connection to > libsndio"); > + > + return TRUE; > + > + /* ERRORS */ > +cannot_configure: > + { > + GST_ELEMENT_ERROR (libsndiosink, RESOURCE, OPEN_WRITE, > + (_("Could not configure libsndio")), > + ("can't configure libsndio")); > + return FALSE; > + } > +cannot_start: > + { > + GST_ELEMENT_ERROR (libsndiosink, RESOURCE, OPEN_WRITE, > + (_("Could not start libsndio")), > + ("can't start libsndio")); > + return FALSE; > + } > +} > + > +static gboolean > +gst_libsndiosink_unprepare (GstAudioSink * asink) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (asink); > + > + if (libsndiosink->hdl == NULL) > + return TRUE; > + > + sio_stop(libsndiosink->hdl); > + > + return TRUE; > +} > + > + > +static guint > +gst_libsndiosink_write (GstAudioSink * asink, gpointer data, guint length) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (asink); > + guint done; > + > + done = sio_write (libsndiosink->hdl, data, length); > + > + if (done == 0) > + goto write_error; > + > + libsndiosink->playpos += (done / libsndiosink->bpf); > + > + data = (char *) data + done; > + > + return done; > + > + /* ERRORS */ > +write_error: > + { > + GST_ELEMENT_ERROR (libsndiosink, RESOURCE, WRITE, > + ("Failed to write data to libsndio"), GST_ERROR_SYSTEM); > + return 0; > + } > +} > + > +static guint > +gst_libsndiosink_delay (GstAudioSink * asink) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (asink); > + > + if (libsndiosink->latency == (guint) - 1) { > + GST_WARNING_OBJECT (asink, "couldn't get latency"); > + return 0; > + } > + > + GST_DEBUG_OBJECT (asink, "got latency: %u", libsndiosink->latency); > + > + return libsndiosink->latency; > +} > + > +static void > +gst_libsndiosink_reset (GstAudioSink * asink) > +{ > + /* no way to flush the buffers with libsndio ? */ > + > + GST_DEBUG_OBJECT (asink, "reset called"); > +} > + > +static void > +gst_libsndiosink_set_property (GObject * object, guint prop_id, const GValue > * value, > + GParamSpec * pspec) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (object); > + > + switch (prop_id) { > + case PROP_HOST: > + g_free (libsndiosink->host); > + libsndiosink->host = g_value_dup_string (value); > + break; > + default: > + break; > + } > +} > + > +static void > +gst_libsndiosink_get_property (GObject * object, guint prop_id, GValue * > value, > + GParamSpec * pspec) > +{ > + GstLibsndioSink *libsndiosink = GST_LIBSNDIOSINK (object); > + > + switch (prop_id) { > + case PROP_HOST: > + g_value_set_string (value, libsndiosink->host); > + break; > + default: > + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); > + break; > + } > +} > Index: files/libsndiosink.h > =================================================================== > RCS file: files/libsndiosink.h > diff -N files/libsndiosink.h > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ files/libsndiosink.h 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,72 @@ > +/* GStreamer > + * Copyright (C) <2008> Jacob Meuser <[EMAIL PROTECTED]> > + * > + * libsndiosink.h: libsndio audio sink > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Library General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Library General Public License for more details. > + * > + * You should have received a copy of the GNU Library General Public > + * License along with this library; if not, write to the > + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, > + * Boston, MA 02111-1307, USA. > + */ > + > + > +#ifndef __GST_LIBSNDIOSINK_H__ > +#define __GST_LIBSNDIOSINK_H__ > + > +#include <sndio.h> > + > +#include <gst/gst.h> > +#include <gst/audio/gstaudiosink.h> > + > +G_BEGIN_DECLS > + > +#define GST_TYPE_LIBSNDIOSINK \ > + (gst_libsndiosink_get_type()) > +#define GST_LIBSNDIOSINK(obj) \ > + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LIBSNDIOSINK,GstLibsndioSink)) > +#define GST_LIBSNDIOSINK_CLASS(klass) \ > + > (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LIBSNDIOSINK,GstLibsndioSinkClass)) > +#define GST_IS_LIBSNDIOSINK(obj) \ > + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LIBSNDIOSINK)) > +#define GST_IS_LIBSNDIOSINK_CLASS(klass) \ > + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LIBSNDIOSINK)) > + > +typedef struct _GstLibsndioSink GstLibsndioSink; > +typedef struct _GstLibsndioSinkClass GstLibsndioSinkClass; > + > +struct _GstLibsndioSink { > + GstAudioSink sink; > + > + struct sio_hdl *hdl; > + gchar *host; > + > + /* bytes per frame */ > + int bpf; > + > + /* frames counts */ > + volatile long long realpos; > + volatile long long playpos; > + volatile guint latency; > + > + GstCaps *cur_caps; > +}; > + > +struct _GstLibsndioSinkClass { > + GstAudioSinkClass parent_class; > +}; > + > +GType gst_libsndiosink_get_type (void); > + > +G_END_DECLS > + > +#endif /* __GST_LIBSNDIOSINK_H__ */ > Index: files/libsndiosrc.c > =================================================================== > RCS file: files/libsndiosrc.c > diff -N files/libsndiosrc.c > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ files/libsndiosrc.c 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,536 @@ > +/* GStreamer > + * Copyright (C) <2008> Jacob Meuser <[EMAIL PROTECTED]> > + * > + * libsndiosrc.c: libsndio audio source > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Library General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Library General Public License for more details. > + * > + * You should have received a copy of the GNU Library General Public > + * License along with this library; if not, write to the > + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, > + * Boston, MA 02111-1307, USA. > + */ > + > +/** > + * SECTION:element-libsndiosrc > + * @see_also: #GstAutoAudioSrc > + * > + * <refsect2> > + * <para> > + * This element retrieves samples from a sound card using libsndio. > + * </para> > + * <para> > + * Simple example pipeline that plays an Ogg/Vorbis file via libsndio: > + * <programlisting> > + * gst-launch -v libsndiosrc ! audioconvert ! vorbisenc ! oggmux ! filesink > location=foo.ogg > + * </programlisting> > + * </para> > + * </refsect2> > + */ > + > +#ifdef HAVE_CONFIG_H > +#include "config.h" > +#endif > + > +#include "libsndiosrc.h" > +#include <unistd.h> > +#include <errno.h> > + > +#include <gst/gst-i18n-plugin.h> > + > +GST_DEBUG_CATEGORY_EXTERN (libsndio_debug); > +#define GST_CAT_DEFAULT libsndio_debug > + > +/* elementfactory information */ > +static const GstElementDetails libsndiosrc_details = > +GST_ELEMENT_DETAILS ("Libsndio audio source", > + "Source/Audio", > + "Records audio through libsndio", > + "Jacob Meuser <[EMAIL PROTECTED]>"); > + > +enum > +{ > + PROP_0, > + PROP_HOST > +}; > + > +static GstStaticPadTemplate libsndio_src_factory = > + GST_STATIC_PAD_TEMPLATE ("src", > + GST_PAD_SRC, > + GST_PAD_ALWAYS, > + GST_STATIC_CAPS ("audio/x-raw-int, " > + "endianness = (int) { 1234, 4321 }, " > + "signed = (boolean) { TRUE, FALSE }, " > + "width = (int) { 8, 16, 24, 32 }, " > + "depth = (int) { 8, 16, 24, 32 }, " > + "rate = (int) [ 8000, 192000 ], " > + "channels = (int) [ 1, 16 ] ") > + ); > + > +static void gst_libsndiosrc_finalize (GObject * object); > + > +static GstCaps *gst_libsndiosrc_getcaps (GstBaseSrc * bsrc); > + > +static gboolean gst_libsndiosrc_open (GstAudioSrc * asrc); > +static gboolean gst_libsndiosrc_close (GstAudioSrc * asrc); > +static gboolean gst_libsndiosrc_prepare (GstAudioSrc * asrc, > + GstRingBufferSpec * spec); > +static gboolean gst_libsndiosrc_unprepare (GstAudioSrc * asrc); > +static guint gst_libsndiosrc_read (GstAudioSrc * asrc, gpointer data, > + guint length); > +static guint gst_libsndiosrc_delay (GstAudioSrc * asrc); > +static void gst_libsndiosrc_reset (GstAudioSrc * asrc); > + > +static void gst_libsndiosrc_set_property (GObject * object, guint prop_id, > + const GValue * value, GParamSpec * pspec); > +static void gst_libsndiosrc_get_property (GObject * object, guint prop_id, > + GValue * value, GParamSpec * pspec); > +static void gst_libsndiosrc_cb(void * addr, int delta); > + > +GST_BOILERPLATE (GstLibsndioSrc, gst_libsndiosrc, GstAudioSrc, > GST_TYPE_AUDIO_SRC); > + > +static void > +gst_libsndiosrc_base_init (gpointer g_class) > +{ > + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); > + > + gst_element_class_set_details (element_class, &libsndiosrc_details); > + > + gst_element_class_add_pad_template (element_class, > + gst_static_pad_template_get (&libsndio_src_factory)); > +} > + > +static void > +gst_libsndiosrc_class_init (GstLibsndioSrcClass * klass) > +{ > + GObjectClass *gobject_class; > + GstBaseSrcClass *gstbasesrc_class; > + GstBaseAudioSrcClass *gstbaseaudiosrc_class; > + GstAudioSrcClass *gstaudiosrc_class; > + > + gobject_class = (GObjectClass *) klass; > + gstbasesrc_class = (GstBaseSrcClass *) klass; > + gstbaseaudiosrc_class = (GstBaseAudioSrcClass *) klass; > + gstaudiosrc_class = (GstAudioSrcClass *) klass; > + > + parent_class = g_type_class_peek_parent (klass); > + > + gobject_class->finalize = gst_libsndiosrc_finalize; > + > + gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (gst_libsndiosrc_getcaps); > + > + gstaudiosrc_class->open = GST_DEBUG_FUNCPTR (gst_libsndiosrc_open); > + gstaudiosrc_class->close = GST_DEBUG_FUNCPTR (gst_libsndiosrc_close); > + gstaudiosrc_class->prepare = GST_DEBUG_FUNCPTR (gst_libsndiosrc_prepare); > + gstaudiosrc_class->unprepare = GST_DEBUG_FUNCPTR > (gst_libsndiosrc_unprepare); > + gstaudiosrc_class->read = GST_DEBUG_FUNCPTR (gst_libsndiosrc_read); > + gstaudiosrc_class->delay = GST_DEBUG_FUNCPTR (gst_libsndiosrc_delay); > + gstaudiosrc_class->reset = GST_DEBUG_FUNCPTR (gst_libsndiosrc_reset); > + > + gobject_class->set_property = gst_libsndiosrc_set_property; > + gobject_class->get_property = gst_libsndiosrc_get_property; > + > + /* default value is filled in the _init method */ > + g_object_class_install_property (gobject_class, PROP_HOST, > + g_param_spec_string ("host", "Host", > + "Device or socket libsndio will access", NULL, G_PARAM_READWRITE)); > +} > + > +static void > +gst_libsndiosrc_init (GstLibsndioSrc * libsndiosrc, GstLibsndioSrcClass * > klass) > +{ > + libsndiosrc->hdl = NULL; > + libsndiosrc->host = g_strdup (g_getenv ("AUDIODEVICE")); > +} > + > +static void > +gst_libsndiosrc_finalize (GObject * object) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (object); > + > + gst_caps_replace (&libsndiosrc->cur_caps, NULL); > + g_free (libsndiosrc->host); > + > + G_OBJECT_CLASS (parent_class)->finalize (object); > +} > + > +static GstCaps * > +gst_libsndiosrc_getcaps (GstBaseSrc * bsrc) > +{ > + GstLibsndioSrc *libsndiosrc; > + > + libsndiosrc = GST_LIBSNDIOSRC (bsrc); > + > + /* no hdl, we're done with the template caps */ > + if (libsndiosrc->cur_caps == NULL) { > + GST_LOG_OBJECT (libsndiosrc, "getcaps called, returning template caps"); > + return NULL; > + } > + > + GST_LOG_OBJECT (libsndiosrc, "returning %" GST_PTR_FORMAT, > libsndiosrc->cur_caps); > + > + return gst_caps_ref (libsndiosrc->cur_caps); > +} > + > +static gboolean > +gst_libsndiosrc_open (GstAudioSrc * asrc) > +{ > + GstPadTemplate *pad_template; > + GstLibsndioSrc *libsndiosrc; > + struct sio_par par; > + struct sio_cap cap; > + GArray *rates, *chans; > + GValue rates_v = { 0 }; > + GValue chans_v = { 0 }; > + GValue value = { 0 }; > + struct sio_enc enc; > + struct sio_conf conf; > + int confs[SIO_NCONF]; > + int rate, chan; > + int i, j, k; > + int nconfs; > + > + libsndiosrc = GST_LIBSNDIOSRC (asrc); > + > + GST_DEBUG_OBJECT (libsndiosrc, "open"); > + > + /* connect */ > + libsndiosrc->hdl = sio_open (libsndiosrc->host, SIO_REC, 0); > + > + if (libsndiosrc->hdl == NULL) > + goto couldnt_connect; > + > + /* Use libsndio defaults as the only encodings, but get the supported > + * sample rates and number of channels. > + */ > + > + if (!sio_getpar(libsndiosrc->hdl, &par)) > + goto no_server_info; > + > + if (!sio_getcap(libsndiosrc->hdl, &cap)) > + goto no_server_info; > + > + rates = g_array_new(FALSE, FALSE, sizeof(int)); > + chans = g_array_new(FALSE, FALSE, sizeof(int)); > + > + /* find confs that have the default encoding */ > + nconfs = 0; > + for (i = 0; i < cap.nconf; i++) { > + for (j = 0; j < SIO_NENC; j++) { > + if (cap.confs[i].enc & (1 << j)) { > + enc = cap.enc[j]; > + if (enc.bits == par.bits && enc.sig == par.sig && enc.le == par.le) { > + confs[nconfs] = i; > + nconfs++; > + break; > + } > + } > + } > + } > + > + /* find the rates and channels of the confs that have the default encoding > */ > + for (i = 0; i < nconfs; i++) { > + conf = cap.confs[confs[i]]; > + /* rates */ > + for (j = 0; j < SIO_NRATE; j++) { > + if (conf.rate & (1 << j)) { > + rate = cap.rate[j]; > + for (k = 0; k < rates->len && rate; k++) { > + if (rate == g_array_index(rates, int, k)) > + rate = 0; > + } > + /* add in ascending order */ > + if (rate) { > + for (k = 0; k < rates->len; k++) { > + if (rate < g_array_index(rates, int, k)) { > + g_array_insert_val(rates, k, rate); > + break; > + } > + } > + if (k == rates->len) > + g_array_append_val(rates, rate); > + } > + } > + } > + /* channels */ > + for (j = 0; j < SIO_NCHAN; j++) { > + if (conf.rchan & (1 << j)) { > + chan = cap.rchan[j]; > + for (k = 0; k < chans->len && chan; k++) { > + if (chan == g_array_index(chans, int, k)) > + chan = 0; > + } > + /* add in ascending order */ > + if (chan) { > + for (k = 0; k < chans->len; k++) { > + if (chan < g_array_index(chans, int, k)) { > + g_array_insert_val(chans, k, chan); > + break; > + } > + } > + if (k == chans->len) > + g_array_append_val(chans, chan); > + } > + } > + } > + } > + /* not sure how this can happen, but it might */ > + if (cap.nconf == 0) { > + g_array_append_val(rates, par.rate); > + g_array_append_val(chans, par.rchan); > + } > + > + g_value_init(&rates_v, GST_TYPE_LIST); > + g_value_init(&chans_v, GST_TYPE_LIST); > + g_value_init(&value, G_TYPE_INT); > + > + for (i = 0; i < rates->len; i++) { > + g_value_set_int(&value, g_array_index(rates, int, i)); > + gst_value_list_append_value(&rates_v, &value); > + } > + for (i = 0; i < chans->len; i++) { > + g_value_set_int(&value, g_array_index(chans, int, i)); > + gst_value_list_append_value(&chans_v, &value); > + } > + > + g_array_free(rates, TRUE); > + g_array_free(chans, TRUE); > + > + pad_template = gst_static_pad_template_get (&libsndio_src_factory); > + libsndiosrc->cur_caps = gst_caps_copy (gst_pad_template_get_caps > (pad_template)); > + gst_object_unref (pad_template); > + > + for (i = 0; i < libsndiosrc->cur_caps->structs->len; i++) { > + GstStructure *s; > + > + s = gst_caps_get_structure (libsndiosrc->cur_caps, i); > + gst_structure_set (s, "endianness", G_TYPE_INT, par.le ? 1234 : 4321, > NULL); > + gst_structure_set (s, "signed", G_TYPE_BOOLEAN, par.sig ? TRUE : FALSE, > NULL); > + gst_structure_set (s, "width", G_TYPE_INT, par.bits, NULL); > + // gst_structure_set (s, "depth", G_TYPE_INT, par.bps * 8, NULL); /* XXX > */ > + gst_structure_set_value (s, "rate", &rates_v); > + gst_structure_set_value (s, "channels", &chans_v); > + } > + > + return TRUE; > + > + /* ERRORS */ > +couldnt_connect: > + { > + GST_ELEMENT_ERROR (libsndiosrc, RESOURCE, OPEN_READ, > + (_("Could not establish connection to libsndio")), > + ("can't open connection to libsndio")); > + return FALSE; > + } > +no_server_info: > + { > + GST_ELEMENT_ERROR (libsndiosrc, RESOURCE, OPEN_READ, > + (_("Failed to query libsndio capabilities")), > + ("couldn't get libsndio info!")); > + return FALSE; > + } > +} > + > +static gboolean > +gst_libsndiosrc_close (GstAudioSrc * asrc) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (asrc); > + > + GST_DEBUG_OBJECT (libsndiosrc, "close"); > + > + gst_caps_replace (&libsndiosrc->cur_caps, NULL); > + sio_close (libsndiosrc->hdl); > + libsndiosrc->hdl = NULL; > + > + return TRUE; > +} > + > +static void > +gst_libsndiosrc_cb(void *addr, int delta) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC ((GstAudioSrc *)addr); > + > + libsndiosrc->realpos += delta; > + > + if (libsndiosrc->readpos >= libsndiosrc->realpos) > + libsndiosrc->latency = 0; > + else > + libsndiosrc->latency = libsndiosrc->realpos - libsndiosrc->readpos; > +} > + > +static gboolean > +gst_libsndiosrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (asrc); > + struct sio_par par; > + int spec_bpf; > + > + GST_DEBUG_OBJECT (libsndiosrc, "prepare"); > + > + libsndiosrc->readpos = libsndiosrc->realpos = libsndiosrc->latency = 0; > + > + sio_initpar(&par); > + par.sig = spec->sign; > + par.le = !spec->bigend; > + par.bits = spec->width; > + // par.bps = spec->depth / 8; /* XXX */ > + par.rate = spec->rate; > + par.rchan = spec->channels; > + > + spec_bpf = ((spec->width / 8) * spec->channels); > + > + par.round = spec->segsize / spec_bpf; > + par.bufsz = (spec->segsize * spec->segtotal) / spec_bpf; > + > + if (!sio_setpar(libsndiosrc->hdl, &par)) > + goto cannot_configure; > + > + sio_getpar(libsndiosrc->hdl, &par); > + > + spec->sign = par.sig; > + spec->bigend = !par.le; > + spec->width = par.bits; > + // spec->depth = par.bps * 8; /* XXX */ > + spec->rate = par.rate; > + spec->channels = par.rchan; > + > + libsndiosrc->bpf = par.bps * par.rchan; > + > + spec->segsize = par.round * par.rchan * par.bps; > + spec->segtotal = par.bufsz / par.round; > + > + /* FIXME: this is wrong for signed ints (and the > + * audioringbuffers should do it for us anyway) */ > + spec->silence_sample[0] = 0; > + spec->silence_sample[1] = 0; > + spec->silence_sample[2] = 0; > + spec->silence_sample[3] = 0; > + > + sio_onmove(libsndiosrc->hdl, gst_libsndiosrc_cb, libsndiosrc); > + > + if (!sio_start(libsndiosrc->hdl)) > + goto cannot_start; > + > + GST_INFO_OBJECT (libsndiosrc, "successfully opened connection to > libsndio"); > + > + return TRUE; > + > + /* ERRORS */ > +cannot_configure: > + { > + GST_ELEMENT_ERROR (libsndiosrc, RESOURCE, OPEN_READ, > + (_("Could not configure libsndio")), > + ("can't configure libsndio")); > + return FALSE; > + } > +cannot_start: > + { > + GST_ELEMENT_ERROR (libsndiosrc, RESOURCE, OPEN_READ, > + (_("Could not start libsndio")), > + ("can't start libsndio")); > + return FALSE; > + } > +} > + > +static gboolean > +gst_libsndiosrc_unprepare (GstAudioSrc * asrc) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (asrc); > + > + if (libsndiosrc->hdl == NULL) > + return TRUE; > + > + sio_stop(libsndiosrc->hdl); > + > + return TRUE; > +} > + > + > +static guint > +gst_libsndiosrc_read (GstAudioSrc * asrc, gpointer data, guint length) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (asrc); > + guint done; > + > + done = sio_read (libsndiosrc->hdl, data, length); > + > + if (done == 0) > + goto read_error; > + > + libsndiosrc->readpos += (done / libsndiosrc->bpf); > + > + data = (char *) data + done; > + > + return done; > + > + /* ERRORS */ > +read_error: > + { > + GST_ELEMENT_ERROR (libsndiosrc, RESOURCE, READ, > + ("Failed to read data from libsndio"), GST_ERROR_SYSTEM); > + return 0; > + } > +} > + > +static guint > +gst_libsndiosrc_delay (GstAudioSrc * asrc) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (asrc); > + > + if (libsndiosrc->latency == (guint) - 1) { > + GST_WARNING_OBJECT (asrc, "couldn't get latency"); > + return 0; > + } > + > + GST_DEBUG_OBJECT (asrc, "got latency: %u", libsndiosrc->latency); > + > + return libsndiosrc->latency; > +} > + > +static void > +gst_libsndiosrc_reset (GstAudioSrc * asrc) > +{ > + /* no way to flush the buffers with libsndio ? */ > + > + GST_DEBUG_OBJECT (asrc, "reset called"); > +} > + > +static void > +gst_libsndiosrc_set_property (GObject * object, guint prop_id, const GValue > * value, > + GParamSpec * pspec) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (object); > + > + switch (prop_id) { > + case PROP_HOST: > + g_free (libsndiosrc->host); > + libsndiosrc->host = g_value_dup_string (value); > + break; > + default: > + break; > + } > +} > + > +static void > +gst_libsndiosrc_get_property (GObject * object, guint prop_id, GValue * > value, > + GParamSpec * pspec) > +{ > + GstLibsndioSrc *libsndiosrc = GST_LIBSNDIOSRC (object); > + > + switch (prop_id) { > + case PROP_HOST: > + g_value_set_string (value, libsndiosrc->host); > + break; > + default: > + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); > + break; > + } > +} > Index: files/libsndiosrc.h > =================================================================== > RCS file: files/libsndiosrc.h > diff -N files/libsndiosrc.h > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ files/libsndiosrc.h 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,72 @@ > +/* GStreamer > + * Copyright (C) <2008> Jacob Meuser <[EMAIL PROTECTED]> > + * > + * libsndiosrc.h: libsndio audio source > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Library General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Library General Public License for more details. > + * > + * You should have received a copy of the GNU Library General Public > + * License along with this library; if not, write to the > + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, > + * Boston, MA 02111-1307, USA. > + */ > + > + > +#ifndef __GST_LIBSNDIOSRC_H__ > +#define __GST_LIBSNDIOSRC_H__ > + > +#include <sndio.h> > + > +#include <gst/gst.h> > +#include <gst/audio/gstaudiosrc.h> > + > +G_BEGIN_DECLS > + > +#define GST_TYPE_LIBSNDIOSRC \ > + (gst_libsndiosrc_get_type()) > +#define GST_LIBSNDIOSRC(obj) \ > + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LIBSNDIOSRC,GstLibsndioSrc)) > +#define GST_LIBSNDIOSRC_CLASS(klass) \ > + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_LIBSNDIOSRC,GstLibsndioSrcClass)) > +#define GST_IS_LIBSNDIOSRC(obj) \ > + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LIBSNDIOSRC)) > +#define GST_IS_LIBSNDIOSRC_CLASS(klass) \ > + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_LIBSNDIOSRC)) > + > +typedef struct _GstLibsndioSrc GstLibsndioSrc; > +typedef struct _GstLibsndioSrcClass GstLibsndioSrcClass; > + > +struct _GstLibsndioSrc { > + GstAudioSrc src; > + > + struct sio_hdl *hdl; > + gchar *host; > + > + /* bytes per frame */ > + int bpf; > + > + /* frames counts */ > + volatile long long realpos; > + volatile long long readpos; > + volatile guint latency; > + > + GstCaps *cur_caps; > +}; > + > +struct _GstLibsndioSrcClass { > + GstAudioSrcClass parent_class; > +}; > + > +GType gst_libsndiosrc_get_type (void); > + > +G_END_DECLS > + > +#endif /* __GST_LIBSNDIOSRC_H__ */ > Index: patches/patch-configure_ac > =================================================================== > RCS file: > /home2/cvs/OpenBSD/ports/multimedia/gstreamer-0.10/plugins-good/patches/patch-configure_ac,v > retrieving revision 1.5 > diff -u -r1.5 patch-configure_ac > --- patches/patch-configure_ac 16 May 2008 14:24:01 -0000 1.5 > +++ patches/patch-configure_ac 28 Oct 2008 03:09:03 -0000 > @@ -1,6 +1,6 @@ > $OpenBSD: patch-configure_ac,v 1.5 2008/05/16 14:24:01 ajacoutot Exp $ > ---- configure.ac.orig Wed Apr 23 03:55:55 2008 > -+++ configure.ac Wed May 14 12:28:02 2008 > +--- configure.ac.orig Tue Apr 22 18:55:55 2008 > ++++ configure.ac Mon Oct 27 01:45:57 2008 > @@ -488,6 +488,8 @@ AG_GST_CHECK_FEATURE(GST_V4L2, [Video 4 Linux 2], v4l2 > #ifdef __sun /* Solaris */ > #include <sys/types.h> > @@ -19,7 +19,29 @@ > #else /* Linux */ > #include <linux/types.h> > #define _LINUX_TIME_H > -@@ -699,7 +703,7 @@ AG_GST_CHECK_FEATURE(FLAC, [FLAC lossless audio], flac > +@@ -676,6 +680,21 @@ AG_GST_CHECK_FEATURE(ESD, [ESounD sound daemon], esdsi > + fi > + ]) > + > ++dnl *** libsndio *** > ++translit(dnm, m, l) AM_CONDITIONAL(USE_LIBSNDIO, true) > ++AG_GST_CHECK_FEATURE(LIBSNDIO, [libsndio audio], libsndioaudio, [ > ++ AC_CHECK_HEADER(sndio.h, HAVE_LIBSNDIO="yes", HAVE_LIBSNDIO="no") > ++ if test $HAVE_LIBSNDIO = yes > ++ then > ++ AC_CHECK_LIB(sndio, sio_open, HAVE_LIBSNDIO="yes", HAVE_LIBSNDIO="no", > []) > ++ if test $HAVE_LIBSNDIO = yes > ++ then > ++ LIBSNDIO_LIBS=-lsndio > ++ AC_SUBST(LIBSNDIO_LIBS) > ++ fi > ++ fi > ++]) > ++ > + dnl *** FLAC *** > + translit(dnm, m, l) AM_CONDITIONAL(USE_FLAC, true) > + AC_TRY_COMPILE([#include <FLAC/export.h>], [ > +@@ -699,7 +718,7 @@ AG_GST_CHECK_FEATURE(FLAC, [FLAC lossless audio], flac > ]) > else > AG_GST_CHECK_FEATURE(FLAC, [FLAC lossless audio], flac, [ > @@ -28,7 +50,7 @@ > dnl API change in FLAC 1.1.3, so require that... > if test x$HAVE_FLAC = xyes; then > AC_CHECK_DECL(FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, > -@@ -773,7 +777,7 @@ AG_GST_CHECK_FEATURE(LIBDV, [libdv DV demuxer/decoder] > +@@ -773,7 +792,7 @@ AG_GST_CHECK_FEATURE(LIBDV, [libdv DV demuxer/decoder] > dnl *** libpng *** > translit(dnm, m, l) AM_CONDITIONAL(USE_LIBPNG, true) > AG_GST_CHECK_FEATURE(LIBPNG, [Portable Network Graphics library], png, [ > @@ -37,3 +59,19 @@ > ]) > > dnl *** dv1394 *** > +@@ -947,6 +966,7 @@ AM_CONDITIONAL(USE_ANNODEX, false) > + AM_CONDITIONAL(USE_CAIRO, false) > + AM_CONDITIONAL(USE_CDIO, false) > + AM_CONDITIONAL(USE_ESD, false) > ++AM_CONDITIONAL(USE_LIBSNDIO, false) > + AM_CONDITIONAL(USE_FLAC, false) > + AM_CONDITIONAL(USE_GCONF, false) > + AM_CONDITIONAL(USE_GDK_PIXBUF, false) > +@@ -1066,6 +1086,7 @@ ext/cairo/Makefile > + ext/cdio/Makefile > + ext/dv/Makefile > + ext/esd/Makefile > ++ext/libsndio/Makefile > + ext/flac/Makefile > + ext/gconf/Makefile > + ext/gdk_pixbuf/Makefile > Index: patches/patch-ext_Makefile_am > =================================================================== > RCS file: patches/patch-ext_Makefile_am > diff -N patches/patch-ext_Makefile_am > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-ext_Makefile_am 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,32 @@ > +$OpenBSD$ > +--- ext/Makefile.am.orig Fri Sep 26 02:05:28 2008 > ++++ ext/Makefile.am Fri Sep 26 02:07:07 2008 > +@@ -82,6 +82,12 @@ else > + LIBPNG_DIR = > + endif > + > ++if USE_LIBSNDIO > ++LIBSNDIO_DIR = libsndio > ++else > ++LIBSNDIO_DIR = > ++endif > ++ > + # if USE_MIKMOD > + # MIKMOD_DIR = mikmod > + # else > +@@ -140,6 +146,7 @@ SUBDIRS = \ > + $(LIBDV_DIR) \ > + $(LIBMNG_DIR) \ > + $(LIBPNG_DIR) \ > ++ $(LIBSNDIO_DIR) \ > + $(MIKMOD_DIR) \ > + $(SHOUT2_DIR) \ > + $(SOUP_DIR) \ > +@@ -162,6 +169,7 @@ DIST_SUBDIRS = \ > + ladspa \ > + libcaca \ > + libpng \ > ++ libsndio \ > + raw1394 \ > + shout2 \ > + soup \ > Index: patches/patch-sys_oss_Makefile_am > =================================================================== > RCS file: patches/patch-sys_oss_Makefile_am > diff -N patches/patch-sys_oss_Makefile_am > --- /dev/null 1 Jan 1970 00:00:00 -0000 > +++ patches/patch-sys_oss_Makefile_am 28 Oct 2008 03:09:03 -0000 > @@ -0,0 +1,13 @@ > +$OpenBSD$ > +--- sys/oss/Makefile.am.orig Fri Sep 26 02:07:41 2008 > ++++ sys/oss/Makefile.am Fri Sep 26 02:08:01 2008 > +@@ -13,7 +13,8 @@ libgstossaudio_la_LIBADD = \ > + $(GST_PLUGINS_BASE_LIBS) \ > + -lgstinterfaces-$(GST_MAJORMINOR) \ > + -lgstaudio-$(GST_MAJORMINOR) \ > +- $(GST_LIBS) > ++ $(GST_LIBS) \ > ++ -lossaudio > + libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) > + > + noinst_HEADERS = common.h \ > Index: patches/patch-sys_oss_Makefile_in > =================================================================== > RCS file: patches/patch-sys_oss_Makefile_in > diff -N patches/patch-sys_oss_Makefile_in > --- patches/patch-sys_oss_Makefile_in 13 May 2008 15:11:51 -0000 1.2 > +++ /dev/null 1 Jan 1970 00:00:00 -0000 > @@ -1,13 +0,0 @@ > -$OpenBSD: patch-sys_oss_Makefile_in,v 1.2 2008/05/13 15:11:51 espie Exp $ > ---- sys/oss/Makefile.in.orig Thu Apr 24 00:39:31 2008 > -+++ sys/oss/Makefile.in Mon May 12 14:28:03 2008 > -@@ -521,7 +521,8 @@ libgstossaudio_la_LIBADD = \ > - $(GST_PLUGINS_BASE_LIBS) \ > - -lgstinterfaces-$(GST_MAJORMINOR) \ > - -lgstaudio-$(GST_MAJORMINOR) \ > -- $(GST_LIBS) > -+ $(GST_LIBS) \ > -+ -lossaudio > - > - libgstossaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) > - > Index: pkg/PLIST-main > =================================================================== > RCS file: > /home2/cvs/OpenBSD/ports/multimedia/gstreamer-0.10/plugins-good/pkg/PLIST-main,v > retrieving revision 1.8 > diff -u -r1.8 PLIST-main > --- pkg/PLIST-main 18 May 2008 13:37:22 -0000 1.8 > +++ pkg/PLIST-main 28 Oct 2008 03:09:03 -0000 > @@ -36,6 +36,8 @@ > lib/gstreamer-${VERSION}/libgstid3demux.so > lib/gstreamer-${VERSION}/libgstlevel.la > lib/gstreamer-${VERSION}/libgstlevel.so > +lib/gstreamer-${VERSION}/libgstlibsndio.la > +lib/gstreamer-${VERSION}/libgstlibsndio.so > lib/gstreamer-${VERSION}/libgstmatroska.la > lib/gstreamer-${VERSION}/libgstmatroska.so > lib/gstreamer-${VERSION}/libgstmonoscope.la > -- [EMAIL PROTECTED] SDF Public Access UNIX System - http://sdf.lonestar.org
