mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
add Sun Audio plugin. Verified that nothing breaks and that make check works.
Original commit message from CVS: add Sun Audio plugin. Verified that nothing breaks and that make check works. Don't think the docs gets properly built yet, but I don't understand exactly how to enable that.
This commit is contained in:
parent
8189a4da72
commit
9b94e38300
16 changed files with 1333 additions and 9 deletions
39
ChangeLog
39
ChangeLog
|
@ -1,3 +1,42 @@
|
|||
2006-01-09 Brian Cameron <brian.cameron@sun.com>
|
||||
|
||||
reviewed by: Christian Schaller <uraeus@gnome.org>
|
||||
|
||||
Add SunAudio plugin - tested to make sure it doesn't break
|
||||
the build under GNU/Linux.
|
||||
|
||||
* configure.ac:
|
||||
* gst-plugins-good.spec.in:
|
||||
* sys/Makefile.am:
|
||||
* sys/sunaudio/Makefile.am:
|
||||
* sys/sunaudio/gstsunaudio.c: (plugin_init):
|
||||
* sys/sunaudio/gstsunaudiomixer.c: (gst_sunaudiomixer_base_init),
|
||||
(gst_sunaudiomixer_class_init), (gst_sunaudiomixer_init),
|
||||
(gst_sunaudiomixer_change_state):
|
||||
* sys/sunaudio/gstsunaudiomixer.h:
|
||||
* sys/sunaudio/gstsunaudiomixerctrl.c:
|
||||
(gst_sunaudiomixer_ctrl_open), (gst_sunaudiomixer_ctrl_build_list),
|
||||
(gst_sunaudiomixer_ctrl_new), (gst_sunaudiomixer_ctrl_free),
|
||||
(gst_sunaudiomixer_ctrl_list_tracks),
|
||||
(gst_sunaudiomixer_ctrl_get_volume),
|
||||
(gst_sunaudiomixer_ctrl_set_volume),
|
||||
(gst_sunaudiomixer_ctrl_set_mute),
|
||||
(gst_sunaudiomixer_ctrl_set_record):
|
||||
* sys/sunaudio/gstsunaudiomixerctrl.h:
|
||||
* sys/sunaudio/gstsunaudiomixertrack.c:
|
||||
(gst_sunaudiomixer_track_class_init),
|
||||
(gst_sunaudiomixer_track_init), (fill_labels),
|
||||
(gst_sunaudiomixer_track_new):
|
||||
* sys/sunaudio/gstsunaudiomixertrack.h:
|
||||
* sys/sunaudio/gstsunaudiosink.c: (gst_sunaudiosink_get_type),
|
||||
(gst_sunaudiosink_dispose), (gst_sunaudiosink_base_init),
|
||||
(gst_sunaudiosink_set_property), (gst_sunaudiosink_get_property),
|
||||
(gst_sunaudiosink_getcaps), (gst_sunaudiosink_open),
|
||||
(gst_sunaudiosink_close), (gst_sunaudiosink_prepare),
|
||||
(gst_sunaudiosink_unprepare), (gst_sunaudiosink_write),
|
||||
(gst_sunaudiosink_delay), (gst_sunaudiosink_reset):
|
||||
* sys/sunaudio/gstsunaudiosink.h:
|
||||
|
||||
2005-01-07 Philippe Khalaf <philippe.kalaf@collabora.co.uk>
|
||||
|
||||
* gst-plugins-good/gst/udp/gstdynudpsink.c:
|
||||
|
|
11
configure.ac
11
configure.ac
|
@ -168,6 +168,10 @@ AC_CHECK_HEADERS([netinet/in.h])
|
|||
AC_CHECK_HEADERS([winsock2.h])
|
||||
AM_CONDITIONAL(HAVE_WINSOCK2_H, test "x$HAVE_WINSOCK2_H" = "xyes")
|
||||
|
||||
dnl Check for FIONREAD ioctl declaration. This check is needed
|
||||
dnl for the UDP plugin to build on Solaris
|
||||
GST_CHECK_FIONREAD()
|
||||
|
||||
dnl *** checks for compiler characteristics ***
|
||||
|
||||
dnl FIXME: check if this is used; was used for floatcast.h in base
|
||||
|
@ -297,6 +301,12 @@ dnl Some old BSD versions and also newer OpenBSD versions :
|
|||
])
|
||||
])
|
||||
|
||||
dnl *** Sun Audio ***
|
||||
translit(dnm, m, l) AM_CONDITIONAL(USE_SUNAUDIO, true)
|
||||
GST_CHECK_FEATURE(SUNAUDIO, [Sun Audio], sunaudiosink, [
|
||||
AC_CHECK_HEADER(sys/audioio.h, HAVE_SUNAUDIO="yes", HAVE_SUNAUDIO="no")
|
||||
])
|
||||
|
||||
dnl *** ext plug-ins ***
|
||||
dnl keep this list sorted alphabetically !
|
||||
|
||||
|
@ -597,6 +607,7 @@ ext/shout2/Makefile
|
|||
ext/speex/Makefile
|
||||
sys/Makefile
|
||||
sys/oss/Makefile
|
||||
sys/sunaudio/Makefile
|
||||
po/Makefile.in
|
||||
gconf/Makefile
|
||||
gconf/gstreamer.schemas
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
<xi:include href="xml/element-goom.xml" />
|
||||
<xi:include href="xml/element-id3demux.xml" />
|
||||
<xi:include href="xml/element-level.xml" />
|
||||
<xi:include href="xml/element-sunaudiomixer.xml" />
|
||||
<xi:include href="xml/element-sunaudiosink.xml" />
|
||||
<xi:include href="xml/element-multipartmux.xml" />
|
||||
<xi:include href="xml/element-multipartdemux.xml" />
|
||||
<xi:include href="xml/element-videomixer.xml" />
|
||||
|
@ -60,6 +62,7 @@
|
|||
<xi:include href="xml/plugin-shout2send.xml" />
|
||||
<xi:include href="xml/plugin-smpte.xml" />
|
||||
<xi:include href="xml/plugin-speex.xml" />
|
||||
<xi:include href="xml/plugin-sunaudio.xml" />
|
||||
<xi:include href="xml/plugin-udp.xml" />
|
||||
<xi:include href="xml/plugin-videobox.xml" />
|
||||
<xi:include href="xml/plugin-videoflip.xml" />
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
# correct User entry for the Host entry for the DOC_SERVER
|
||||
|
||||
# these variables define the location of the online docs
|
||||
DOC_SERVER=freedesktop.org
|
||||
DOC_SERVER=uraeus@freedesktop.org
|
||||
DOC_BASE=/srv/gstreamer.freedesktop.org/www/data/doc
|
||||
DOC_URL=$(DOC_SERVER):$(DOC_BASE)
|
||||
GST_VERSION_NANO = $(GST_PLUGINS_GOOD_VERSION_NANO)
|
||||
|
|
|
@ -110,6 +110,7 @@ rm -rf $RPM_BUILD_ROOT
|
|||
%{_libdir}/gstreamer-%{majorminor}/libgstvideomixer.so
|
||||
%{_libdir}/gstreamer-%{majorminor}/libgstcutter.so
|
||||
%{_libdir}/gstreamer-%{majorminor}/libgstmultipart.so
|
||||
%{_libdir}/gstreamer-%{majorminor}/libgstid3demux.so
|
||||
|
||||
# gstreamer-plugins with external dependencies but in the main package
|
||||
@USE_LIBCACA_TRUE@%{_libdir}/gstreamer-%{majorminor}/libgstcacasink.so
|
||||
|
|
|
@ -10,6 +10,12 @@ else
|
|||
OSS_DIR=
|
||||
endif
|
||||
|
||||
if USE_SUNAUDIO
|
||||
SUNAUDIO_DIR=sunaudio
|
||||
else
|
||||
SUNAUDIO_DIR=
|
||||
endif
|
||||
|
||||
# if USE_OSX_AUDIO
|
||||
# OSX_AUDIO_DIR=osxaudio
|
||||
# else
|
||||
|
@ -28,12 +34,6 @@ endif
|
|||
# QCAM_DIR=
|
||||
# endif
|
||||
|
||||
# if USE_SUNAUDIO
|
||||
# SUNAUDIO_DIR=sunaudio
|
||||
# else
|
||||
# SUNAUDIO_DIR=
|
||||
# endif
|
||||
|
||||
# if USE_GST_V4L2
|
||||
# V4L2_DIR=v4l2
|
||||
# else
|
||||
|
@ -58,6 +58,6 @@ endif
|
|||
# GL_DIR=
|
||||
# endif
|
||||
|
||||
SUBDIRS=$(OSS_DIR)
|
||||
SUBDIRS=$(OSS_DIR) $(SUNAUDIO_DIR)
|
||||
|
||||
DIST_SUBDIRS=oss
|
||||
DIST_SUBDIRS=oss sunaudio
|
||||
|
|
21
sys/sunaudio/Makefile.am
Normal file
21
sys/sunaudio/Makefile.am
Normal file
|
@ -0,0 +1,21 @@
|
|||
plugin_LTLIBRARIES = libgstsunaudio.la
|
||||
|
||||
libgstsunaudio_la_SOURCES = gstsunaudio.c \
|
||||
gstsunaudiosink.c \
|
||||
gstsunaudiomixerctrl.c \
|
||||
gstsunaudiomixer.c \
|
||||
gstsunaudiomixertrack.c
|
||||
|
||||
libgstsunaudio_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
|
||||
libgstsunaudio_la_LIBADD = \
|
||||
-lgstinterfaces-@GST_MAJORMINOR@ \
|
||||
-lgstaudio-@GST_MAJORMINOR@ \
|
||||
$(GST_PLUGINS_BASE_LIBS) \
|
||||
$(GST_LIBS)
|
||||
libgstsunaudio_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||
|
||||
noinst_HEADERS = gstsunaudiosink.h \
|
||||
gstsunaudiomixer.h \
|
||||
gstsunaudiomixerctrl.h \
|
||||
gstsunaudiomixertrack.h
|
||||
|
58
sys/sunaudio/gstsunaudio.c
Normal file
58
sys/sunaudio/gstsunaudio.c
Normal file
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) <2005> Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* 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 "gst/gst-i18n-plugin.h"
|
||||
|
||||
#include "gstsunaudiomixer.h"
|
||||
#include "gstsunaudiosink.h"
|
||||
|
||||
extern gchar *__gst_oss_plugin_dir;
|
||||
|
||||
GST_DEBUG_CATEGORY (sunaudio_debug);
|
||||
|
||||
static gboolean
|
||||
plugin_init (GstPlugin * plugin)
|
||||
{
|
||||
if (!gst_element_register (plugin, "sunaudiomixer", GST_RANK_NONE,
|
||||
GST_TYPE_SUNAUDIO_MIXER) ||
|
||||
!gst_element_register (plugin, "sunaudiosink", GST_RANK_SECONDARY,
|
||||
GST_TYPE_SUNAUDIO_SINK)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GST_DEBUG_CATEGORY_INIT (sunaudio_debug, "sunaudio", 0, "sunaudio 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,
|
||||
"sunaudio",
|
||||
"Sun Audio support for GStreamer",
|
||||
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
|
110
sys/sunaudio/gstsunaudiomixer.c
Normal file
110
sys/sunaudio/gstsunaudiomixer.c
Normal file
|
@ -0,0 +1,110 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* 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-sunaudiomixer
|
||||
*
|
||||
* <refsect2>
|
||||
* <para>
|
||||
* sunaudiomixer is an mixer that controls the sound input and output
|
||||
* levels with the Sun Audio interface available in Solaris.
|
||||
* </para>
|
||||
* </refsect2>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "gstsunaudiomixer.h"
|
||||
|
||||
static GstElementDetails gst_sunaudiomixer_details =
|
||||
GST_ELEMENT_DETAILS ("Sun Audio Mixer",
|
||||
"Generic/Audio",
|
||||
"Control sound input and output levels with Sun Audio",
|
||||
"Brian Cameron <brian.cameron@sun.com>");
|
||||
|
||||
GST_BOILERPLATE_WITH_INTERFACE (GstSunAudioMixer, gst_sunaudiomixer,
|
||||
GstElement, GST_TYPE_ELEMENT, GstMixer, GST_TYPE_MIXER, gst_sunaudiomixer)
|
||||
|
||||
GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS (GstSunAudioMixer, gst_sunaudiomixer)
|
||||
|
||||
static GstStateChangeReturn gst_sunaudiomixer_change_state (GstElement *
|
||||
element, GstStateChange transition);
|
||||
|
||||
static void gst_sunaudiomixer_base_init (gpointer klass)
|
||||
{
|
||||
gst_element_class_set_details (GST_ELEMENT_CLASS (klass),
|
||||
&gst_sunaudiomixer_details);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_class_init (GstSunAudioMixerClass * klass)
|
||||
{
|
||||
GstElementClass *element_class;
|
||||
|
||||
element_class = (GstElementClass *) klass;
|
||||
|
||||
element_class->change_state = gst_sunaudiomixer_change_state;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_init (GstSunAudioMixer * this,
|
||||
GstSunAudioMixerClass * g_class)
|
||||
{
|
||||
this->mixer = NULL;
|
||||
}
|
||||
|
||||
static GstStateChangeReturn
|
||||
gst_sunaudiomixer_change_state (GstElement * element, GstStateChange transition)
|
||||
{
|
||||
GstSunAudioMixer *this = GST_SUNAUDIO_MIXER (element);
|
||||
|
||||
switch (transition) {
|
||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||
if (!this->mixer) {
|
||||
const char *audiodev;
|
||||
|
||||
audiodev = g_getenv ("AUDIODEV");
|
||||
if (audiodev == NULL) {
|
||||
this->mixer = gst_sunaudiomixer_ctrl_new ("/dev/audioctl");
|
||||
} else {
|
||||
gchar *device = g_strdup_printf ("/dev/%sctl", audiodev);
|
||||
|
||||
this->mixer = gst_sunaudiomixer_ctrl_new (device);
|
||||
g_free (device);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
if (this->mixer) {
|
||||
gst_sunaudiomixer_ctrl_free (this->mixer);
|
||||
this->mixer = NULL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (GST_ELEMENT_CLASS (parent_class)->change_state)
|
||||
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
||||
|
||||
return GST_STATE_CHANGE_SUCCESS;
|
||||
}
|
50
sys/sunaudio/gstsunaudiomixer.h
Normal file
50
sys/sunaudio/gstsunaudiomixer.h
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GST_SUNAUDIO_MIXER_H__
|
||||
#define __GST_SUNAUDIO_MIXER_H__
|
||||
|
||||
#include "gstsunaudiomixerctrl.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_SUNAUDIO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_MIXER,GstSunAudioMixer))
|
||||
#define GST_SUNAUDIO_MIXER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_MIXER,GstSunAudioMixerClass))
|
||||
#define GST_IS_SUNAUDIO_MIXER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_MIXER))
|
||||
#define GST_IS_SUNAUDIO_MIXER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_MIXER))
|
||||
#define GST_TYPE_SUNAUDIO_MIXER (gst_sunaudiomixer_get_type())
|
||||
|
||||
typedef struct _GstSunAudioMixer GstSunAudioMixer;
|
||||
typedef struct _GstSunAudioMixerClass GstSunAudioMixerClass;
|
||||
|
||||
struct _GstSunAudioMixer {
|
||||
GstElement parent;
|
||||
|
||||
GstSunAudioMixerCtrl *mixer;
|
||||
};
|
||||
|
||||
struct _GstSunAudioMixerClass {
|
||||
GstElementClass parent;
|
||||
};
|
||||
|
||||
GType gst_sunaudiomixer_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_SUNAUDIO_MIXER_H__ */
|
247
sys/sunaudio/gstsunaudiomixerctrl.c
Normal file
247
sys/sunaudio/gstsunaudiomixerctrl.c
Normal file
|
@ -0,0 +1,247 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <gst/gst-i18n-plugin.h>
|
||||
|
||||
#include "gstsunaudiomixerctrl.h"
|
||||
#include "gstsunaudiomixertrack.h"
|
||||
|
||||
#define SCALE_FACTOR 2.55 /* 255/100 */
|
||||
|
||||
static gboolean
|
||||
gst_sunaudiomixer_ctrl_open (GstSunAudioMixerCtrl * sunaudio)
|
||||
{
|
||||
int fd;
|
||||
|
||||
/* First try to open non-blocking */
|
||||
fd = open (sunaudio->device, O_RDWR | O_NONBLOCK);
|
||||
|
||||
if (fd >= 0) {
|
||||
close (fd);
|
||||
fd = open (sunaudio->device, O_WRONLY);
|
||||
}
|
||||
|
||||
if (fd == -1) {
|
||||
GST_DEBUG_OBJECT (sunaudio,
|
||||
"Failed to open mixer device %s, mixing disabled: %s", sunaudio->device,
|
||||
strerror (errno));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sunaudio->mixer_fd = fd;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
gst_sunaudiomixer_ctrl_build_list (GstSunAudioMixerCtrl * sunaudio)
|
||||
{
|
||||
GstMixerTrack *track;
|
||||
|
||||
g_return_if_fail (sunaudio->mixer_fd != -1);
|
||||
|
||||
track = gst_sunaudiomixer_track_new (0, 1, GST_MIXER_TRACK_OUTPUT);
|
||||
sunaudio->tracklist = g_list_append (sunaudio->tracklist, track);
|
||||
track = gst_sunaudiomixer_track_new (1, 1, 0);
|
||||
sunaudio->tracklist = g_list_append (sunaudio->tracklist, track);
|
||||
track = gst_sunaudiomixer_track_new (2, 1, 0);
|
||||
sunaudio->tracklist = g_list_append (sunaudio->tracklist, track);
|
||||
}
|
||||
|
||||
GstSunAudioMixerCtrl *
|
||||
gst_sunaudiomixer_ctrl_new (const char *device)
|
||||
{
|
||||
GstSunAudioMixerCtrl *ret = NULL;
|
||||
|
||||
g_return_val_if_fail (device != NULL, NULL);
|
||||
|
||||
ret = g_new0 (GstSunAudioMixerCtrl, 1);
|
||||
|
||||
ret->device = g_strdup (device);
|
||||
ret->mixer_fd = -1;
|
||||
|
||||
if (!gst_sunaudiomixer_ctrl_open (ret))
|
||||
goto error;
|
||||
|
||||
return ret;
|
||||
|
||||
error:
|
||||
if (ret)
|
||||
gst_sunaudiomixer_ctrl_free (ret);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
gst_sunaudiomixer_ctrl_free (GstSunAudioMixerCtrl * mixer)
|
||||
{
|
||||
g_return_if_fail (mixer != NULL);
|
||||
|
||||
if (mixer->device) {
|
||||
g_free (mixer->device);
|
||||
mixer->device = NULL;
|
||||
}
|
||||
|
||||
if (mixer->tracklist) {
|
||||
g_list_foreach (mixer->tracklist, (GFunc) g_object_unref, NULL);
|
||||
g_list_free (mixer->tracklist);
|
||||
mixer->tracklist = NULL;
|
||||
}
|
||||
|
||||
if (mixer->mixer_fd != -1) {
|
||||
close (mixer->mixer_fd);
|
||||
mixer->mixer_fd = -1;
|
||||
}
|
||||
|
||||
g_free (mixer);
|
||||
}
|
||||
|
||||
const GList *
|
||||
gst_sunaudiomixer_ctrl_list_tracks (GstSunAudioMixerCtrl * mixer)
|
||||
{
|
||||
gst_sunaudiomixer_ctrl_build_list (mixer);
|
||||
return (const GList *) mixer->tracklist;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_ctrl_get_volume (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track, gint * volumes)
|
||||
{
|
||||
gint volume;
|
||||
struct audio_info audioinfo;
|
||||
GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track);
|
||||
|
||||
g_return_if_fail (mixer->mixer_fd != -1);
|
||||
|
||||
if (ioctl (mixer->mixer_fd, AUDIO_GETINFO, &audioinfo) < 0) {
|
||||
g_warning ("Error getting audio device volume");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (sunaudiotrack->track_num) {
|
||||
case 0:
|
||||
sunaudiotrack->vol = volumes[0] =
|
||||
(audioinfo.play.gain / SCALE_FACTOR) + 0.5;
|
||||
break;
|
||||
case 1:
|
||||
sunaudiotrack->vol = volumes[0] =
|
||||
(audioinfo.record.gain / SCALE_FACTOR) + 0.5;
|
||||
break;
|
||||
case 2:
|
||||
sunaudiotrack->vol = volumes[0] =
|
||||
(audioinfo.monitor_gain / SCALE_FACTOR) + 0.5;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track, gint * volumes)
|
||||
{
|
||||
gint volume;
|
||||
gchar buf[100];
|
||||
struct audio_info audioinfo;
|
||||
GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track);
|
||||
|
||||
g_return_if_fail (mixer->mixer_fd != -1);
|
||||
|
||||
volume = volumes[0] * SCALE_FACTOR + 0.5;
|
||||
|
||||
/* Set the volume */
|
||||
AUDIO_INITINFO (&audioinfo);
|
||||
|
||||
switch (sunaudiotrack->track_num) {
|
||||
case 0:
|
||||
audioinfo.play.gain = volume;
|
||||
break;
|
||||
case 1:
|
||||
audioinfo.record.gain = volume;
|
||||
break;
|
||||
case 2:
|
||||
audioinfo.monitor_gain = volume;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ioctl (mixer->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) {
|
||||
g_warning ("Error setting audio device volume");
|
||||
return;
|
||||
}
|
||||
|
||||
sunaudiotrack->vol = volume;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_ctrl_set_mute (GstSunAudioMixerCtrl * sunaudio,
|
||||
GstMixerTrack * track, gboolean mute)
|
||||
{
|
||||
struct audio_info audioinfo;
|
||||
GstSunAudioMixerTrack *sunaudiotrack = GST_SUNAUDIO_MIXER_TRACK (track);
|
||||
gint volume;
|
||||
|
||||
g_return_if_fail (sunaudio->mixer_fd != -1);
|
||||
if (sunaudiotrack->track_num != 0)
|
||||
return;
|
||||
|
||||
AUDIO_INITINFO (&audioinfo);
|
||||
|
||||
if (mute) {
|
||||
audioinfo.output_muted = 1;
|
||||
volume = 0;
|
||||
} else {
|
||||
audioinfo.output_muted = 0;
|
||||
volume = sunaudiotrack->vol;
|
||||
}
|
||||
|
||||
switch (sunaudiotrack->track_num) {
|
||||
case 0:
|
||||
audioinfo.play.gain = volume;
|
||||
break;
|
||||
case 1:
|
||||
audioinfo.record.gain = volume;
|
||||
break;
|
||||
case 2:
|
||||
audioinfo.monitor_gain = volume;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ioctl (sunaudio->mixer_fd, AUDIO_SETINFO, &audioinfo) < 0) {
|
||||
g_warning ("Error setting audio device volume");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_ctrl_set_record (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track, gboolean record)
|
||||
{
|
||||
/* Implementation Pending */
|
||||
}
|
142
sys/sunaudio/gstsunaudiomixerctrl.h
Normal file
142
sys/sunaudio/gstsunaudiomixerctrl.h
Normal file
|
@ -0,0 +1,142 @@
|
|||
/* SunAudio mixer interface element.
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __GST_SUNAUDIO_MIXER_CTRL_H
|
||||
#define __GST_SUNAUDIO_MIXER_CTRL_H
|
||||
|
||||
#include <sys/audioio.h>
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/interfaces/mixer.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_SUNAUDIO_MIXER_CTRL(obj) ((GstSunAudioMixerCtrl*)(obj))
|
||||
|
||||
typedef struct _GstSunAudioMixerCtrl GstSunAudioMixerCtrl;
|
||||
|
||||
struct _GstSunAudioMixerCtrl {
|
||||
GList * tracklist; /* list of available tracks */
|
||||
|
||||
gint fd;
|
||||
gint mixer_fd;
|
||||
|
||||
gchar * device;
|
||||
};
|
||||
|
||||
GstSunAudioMixerCtrl* gst_sunaudiomixer_ctrl_new (const gchar *device);
|
||||
void gst_sunaudiomixer_ctrl_free (GstSunAudioMixerCtrl *mixer);
|
||||
|
||||
const GList* gst_sunaudiomixer_ctrl_list_tracks (GstSunAudioMixerCtrl * mixer);
|
||||
void gst_sunaudiomixer_ctrl_set_volume (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track,
|
||||
gint * volumes);
|
||||
void gst_sunaudiomixer_ctrl_get_volume (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track,
|
||||
gint * volumes);
|
||||
void gst_sunaudiomixer_ctrl_set_record (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track,
|
||||
gboolean record);
|
||||
void gst_sunaudiomixer_ctrl_set_mute (GstSunAudioMixerCtrl * mixer,
|
||||
GstMixerTrack * track,
|
||||
gboolean mute);
|
||||
|
||||
#define GST_IMPLEMENT_SUNAUDIO_MIXER_CTRL_METHODS(Type, interface_as_function) \
|
||||
static gboolean \
|
||||
interface_as_function ## _supported (Type *this, GType iface_type) \
|
||||
{ \
|
||||
g_assert (iface_type == GST_TYPE_MIXER); \
|
||||
\
|
||||
return (this->mixer != NULL); \
|
||||
} \
|
||||
\
|
||||
static const GList* \
|
||||
interface_as_function ## _list_tracks (GstMixer * mixer) \
|
||||
{ \
|
||||
Type *this = (Type*) mixer; \
|
||||
\
|
||||
g_return_val_if_fail (this != NULL, NULL); \
|
||||
g_return_val_if_fail (this->mixer != NULL, NULL); \
|
||||
\
|
||||
return gst_sunaudiomixer_ctrl_list_tracks (this->mixer); \
|
||||
} \
|
||||
\
|
||||
static void \
|
||||
interface_as_function ## _set_volume (GstMixer * mixer, GstMixerTrack * track, \
|
||||
gint * volumes) \
|
||||
{ \
|
||||
Type *this = (Type*) mixer; \
|
||||
\
|
||||
g_return_if_fail (this != NULL); \
|
||||
g_return_if_fail (this->mixer != NULL); \
|
||||
\
|
||||
gst_sunaudiomixer_ctrl_set_volume (this->mixer, track, volumes); \
|
||||
} \
|
||||
\
|
||||
static void \
|
||||
interface_as_function ## _get_volume (GstMixer * mixer, GstMixerTrack * track, \
|
||||
gint * volumes) \
|
||||
{ \
|
||||
Type *this = (Type*) mixer; \
|
||||
\
|
||||
g_return_if_fail (this != NULL); \
|
||||
g_return_if_fail (this->mixer != NULL); \
|
||||
\
|
||||
gst_sunaudiomixer_ctrl_get_volume (this->mixer, track, volumes); \
|
||||
} \
|
||||
\
|
||||
static void \
|
||||
interface_as_function ## _set_record (GstMixer * mixer, GstMixerTrack * track, \
|
||||
gboolean record) \
|
||||
{ \
|
||||
Type *this = (Type*) mixer; \
|
||||
\
|
||||
g_return_if_fail (this != NULL); \
|
||||
g_return_if_fail (this->mixer != NULL); \
|
||||
\
|
||||
gst_sunaudiomixer_ctrl_set_record (this->mixer, track, record); \
|
||||
} \
|
||||
\
|
||||
static void \
|
||||
interface_as_function ## _set_mute (GstMixer * mixer, GstMixerTrack * track, \
|
||||
gboolean mute) \
|
||||
{ \
|
||||
Type *this = (Type*) mixer; \
|
||||
\
|
||||
g_return_if_fail (this != NULL); \
|
||||
g_return_if_fail (this->mixer != NULL); \
|
||||
\
|
||||
gst_sunaudiomixer_ctrl_set_mute (this->mixer, track, mute); \
|
||||
} \
|
||||
\
|
||||
static void \
|
||||
interface_as_function ## _interface_init (GstMixerClass * klass) \
|
||||
{ \
|
||||
GST_MIXER_TYPE (klass) = GST_MIXER_HARDWARE; \
|
||||
\
|
||||
/* set up the interface hooks */ \
|
||||
klass->list_tracks = interface_as_function ## _list_tracks; \
|
||||
klass->set_volume = interface_as_function ## _set_volume; \
|
||||
klass->get_volume = interface_as_function ## _get_volume; \
|
||||
klass->set_mute = interface_as_function ## _set_mute; \
|
||||
klass->set_record = interface_as_function ## _set_record; \
|
||||
}
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif
|
109
sys/sunaudio/gstsunaudiomixertrack.c
Normal file
109
sys/sunaudio/gstsunaudiomixertrack.c
Normal file
|
@ -0,0 +1,109 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* gstsunaudiomixer.c: mixer interface implementation for OSS
|
||||
*
|
||||
* 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <gst/gst-i18n-plugin.h>
|
||||
|
||||
#include "gstsunaudiomixertrack.h"
|
||||
|
||||
#define MIXER_DEVICES 3
|
||||
#define MASK_BIT_IS_SET(mask, bit) \
|
||||
(mask & (1 << bit))
|
||||
|
||||
G_DEFINE_TYPE (GstSunAudioMixerTrack, gst_sunaudiomixer_track,
|
||||
GST_TYPE_MIXER_TRACK);
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_track_class_init (GstSunAudioMixerTrackClass * klass)
|
||||
{
|
||||
/* nop */
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiomixer_track_init (GstSunAudioMixerTrack * track)
|
||||
{
|
||||
track->vol = 0;
|
||||
track->track_num = 0;
|
||||
}
|
||||
|
||||
static const gchar **labels = NULL;
|
||||
|
||||
static void
|
||||
fill_labels (void)
|
||||
{
|
||||
int i;
|
||||
struct
|
||||
{
|
||||
gchar *given, *wanted;
|
||||
}
|
||||
cases[] = {
|
||||
{
|
||||
"Vol ", N_("Volume")}
|
||||
, {
|
||||
"Gain ", N_("Gain")}
|
||||
, {
|
||||
"Mon ", N_("Monitor")}
|
||||
, {
|
||||
NULL, NULL}
|
||||
};
|
||||
|
||||
labels = g_malloc (sizeof (gchar *) * MIXER_DEVICES);
|
||||
|
||||
for (i = 0; i < MIXER_DEVICES; i++) {
|
||||
labels[i] = g_strdup (cases[i].wanted);
|
||||
}
|
||||
}
|
||||
|
||||
GstMixerTrack *
|
||||
gst_sunaudiomixer_track_new (gint track_num, gint max_chans, gint flags)
|
||||
{
|
||||
GstSunAudioMixerTrack *sunaudiotrack;
|
||||
GstMixerTrack *track;
|
||||
gint volume;
|
||||
|
||||
if (!labels)
|
||||
fill_labels ();
|
||||
|
||||
sunaudiotrack = g_object_new (GST_TYPE_SUNAUDIO_MIXER_TRACK, NULL);
|
||||
track = GST_MIXER_TRACK (sunaudiotrack);
|
||||
track->label = g_strdup (labels[track_num]);
|
||||
track->num_channels = max_chans;
|
||||
track->flags = flags;
|
||||
track->min_volume = 0;
|
||||
track->max_volume = 100;
|
||||
sunaudiotrack->track_num = track_num;
|
||||
|
||||
sunaudiotrack->vol = (0 & 0xff);
|
||||
|
||||
return track;
|
||||
}
|
59
sys/sunaudio/gstsunaudiomixertrack.h
Normal file
59
sys/sunaudio/gstsunaudiomixertrack.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/* GStreamer SunAudio Mixer implementation
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* gstsunaudiomixertrack.h: SunAudio mixer tracks
|
||||
*
|
||||
* 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_SUNAUDIO_MIXER_TRACK_H__
|
||||
#define __GST_SUNAUDIO_MIXER_TRACK_H__
|
||||
|
||||
#include <gst/gst.h>
|
||||
#include <gst/interfaces/mixer.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_SUNAUDIO_MIXER_TRACK \
|
||||
(gst_sunaudiomixer_track_get_type ())
|
||||
#define GST_SUNAUDIO_MIXER_TRACK(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_SUNAUDIO_MIXER_TRACK, \
|
||||
GstSunAudioMixerTrack))
|
||||
#define GST_SUNAUDIO_MIXER_TRACK_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_SUNAUDIO_MIXER_TRACK, \
|
||||
GstSunAudioMixerTrackClass))
|
||||
#define GST_IS_SUNAUDIO_MIXER_TRACK(obj) \
|
||||
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_SUNAUDIO_MIXER_TRACK))
|
||||
#define GST_IS_SUNAUDIO_MIXER_TRACK_CLASS(klass) \
|
||||
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_SUNAUDIO_MIXER_TRACK))
|
||||
|
||||
typedef struct _GstSunAudioMixerTrack {
|
||||
GstMixerTrack parent;
|
||||
|
||||
gint vol;
|
||||
gint track_num;
|
||||
} GstSunAudioMixerTrack;
|
||||
|
||||
typedef struct _GstSunAudioMixerTrackClass {
|
||||
GstMixerTrackClass parent;
|
||||
} GstSunAudioMixerTrackClass;
|
||||
|
||||
GType gst_sunaudiomixer_track_get_type (void);
|
||||
GstMixerTrack* gst_sunaudiomixer_track_new (gint track_num, gint max_chans, gint flags);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_SUNAUDIO_MIXER_TRACK_H__ */
|
411
sys/sunaudio/gstsunaudiosink.c
Normal file
411
sys/sunaudio/gstsunaudiosink.c
Normal file
|
@ -0,0 +1,411 @@
|
|||
/*
|
||||
* GStreamer
|
||||
* Copyright (C) 2004 David A. Schleef <ds@schleef.org>
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* 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-sunaudiosink
|
||||
*
|
||||
* <refsect2>
|
||||
* <para>
|
||||
* sunaudiosink is an audio sink designed to work with the Sun Audio
|
||||
* interface available in Solaris.
|
||||
* </para>
|
||||
* <title>Example launch line</title>
|
||||
* <para>
|
||||
* <programlisting>
|
||||
* gst-launch -v sinesrc ! sunaudiosink
|
||||
* </programlisting>
|
||||
* </para>
|
||||
* </refsect2>
|
||||
*/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/mman.h>
|
||||
|
||||
#include "gstsunaudiosink.h"
|
||||
|
||||
/* elementfactory information */
|
||||
static GstElementDetails plugin_details = GST_ELEMENT_DETAILS ("Sun Audio Sink",
|
||||
"Sink/Audio",
|
||||
"Audio sink for Sun Audio devices",
|
||||
"David A. Schleef <ds@schleef.org>, "
|
||||
"Brian Cameron <brian.cameron@sun.com>");
|
||||
|
||||
static void gst_sunaudiosink_base_init (gpointer g_class);
|
||||
static void gst_sunaudiosink_class_init (GstSunAudioSinkClass * klass);
|
||||
static void gst_sunaudiosink_init (GstSunAudioSink * filter);
|
||||
static void gst_sunaudiosink_dispose (GObject * object);
|
||||
|
||||
static void gst_sunaudiosink_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
static void gst_sunaudiosink_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec);
|
||||
|
||||
static GstCaps *gst_sunaudiosink_getcaps (GstBaseSink * bsink);
|
||||
|
||||
static gboolean gst_sunaudiosink_open (GstAudioSink * asink);
|
||||
static gboolean gst_sunaudiosink_close (GstAudioSink * asink);
|
||||
static gboolean gst_sunaudiosink_prepare (GstAudioSink * asink,
|
||||
GstRingBufferSpec * spec);
|
||||
static gboolean gst_sunaudiosink_unprepare (GstAudioSink * asink);
|
||||
static guint gst_sunaudiosink_write (GstAudioSink * asink, gpointer data,
|
||||
guint length);
|
||||
static guint gst_sunaudiosink_delay (GstAudioSink * asink);
|
||||
static void gst_sunaudiosink_reset (GstAudioSink * asink);
|
||||
|
||||
#define DEFAULT_DEVICE "/dev/audio"
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_DEVICE,
|
||||
};
|
||||
|
||||
static GstStaticPadTemplate gst_sunaudiosink_factory =
|
||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS ("audio/x-raw-int, "
|
||||
"endianness = (int) BYTE_ORDER, "
|
||||
"signed = (boolean) TRUE, " "width = (int) 16, " "depth = (int) 16, "
|
||||
/* [5510,48000] seems to be a Solaris limit */
|
||||
"rate = (int) [ 5510, 48000 ], " "channels = (int) [ 1, 2 ]")
|
||||
);
|
||||
|
||||
static GstElementClass *parent_class = NULL;
|
||||
|
||||
GType
|
||||
gst_sunaudiosink_get_type (void)
|
||||
{
|
||||
static GType plugin_type = 0;
|
||||
|
||||
if (!plugin_type) {
|
||||
static const GTypeInfo plugin_info = {
|
||||
sizeof (GstSunAudioSinkClass),
|
||||
gst_sunaudiosink_base_init,
|
||||
NULL,
|
||||
(GClassInitFunc) gst_sunaudiosink_class_init,
|
||||
NULL,
|
||||
NULL,
|
||||
sizeof (GstSunAudioSink),
|
||||
0,
|
||||
(GInstanceInitFunc) gst_sunaudiosink_init,
|
||||
};
|
||||
|
||||
plugin_type = g_type_register_static (GST_TYPE_AUDIO_SINK,
|
||||
"GstSunAudioSink", &plugin_info, 0);
|
||||
}
|
||||
return plugin_type;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_dispose (GObject * object)
|
||||
{
|
||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_base_init (gpointer g_class)
|
||||
{
|
||||
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
|
||||
|
||||
gst_element_class_add_pad_template (element_class,
|
||||
gst_static_pad_template_get (&gst_sunaudiosink_factory));
|
||||
gst_element_class_set_details (element_class, &plugin_details);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_class_init (GstSunAudioSinkClass * klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GstElementClass *gstelement_class;
|
||||
GstBaseSinkClass *gstbasesink_class;
|
||||
GstBaseAudioSinkClass *gstbaseaudiosink_class;
|
||||
GstAudioSinkClass *gstaudiosink_class;
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
gstelement_class = (GstElementClass *) klass;
|
||||
gstbasesink_class = (GstBaseSinkClass *) klass;
|
||||
gstbaseaudiosink_class = (GstBaseAudioSinkClass *) klass;
|
||||
gstaudiosink_class = (GstAudioSinkClass *) klass;
|
||||
|
||||
parent_class = g_type_class_ref (GST_TYPE_BASE_AUDIO_SINK);
|
||||
|
||||
gobject_class->dispose = gst_sunaudiosink_dispose;
|
||||
gobject_class->set_property =
|
||||
GST_DEBUG_FUNCPTR (gst_sunaudiosink_set_property);
|
||||
gobject_class->get_property =
|
||||
GST_DEBUG_FUNCPTR (gst_sunaudiosink_get_property);
|
||||
|
||||
g_object_class_install_property (gobject_class, PROP_DEVICE,
|
||||
g_param_spec_string ("device", "Device", "Audio Device (/dev/audio)",
|
||||
DEFAULT_DEVICE, G_PARAM_READWRITE));
|
||||
|
||||
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_sunaudiosink_getcaps);
|
||||
|
||||
gstaudiosink_class->open = GST_DEBUG_FUNCPTR (gst_sunaudiosink_open);
|
||||
gstaudiosink_class->close = GST_DEBUG_FUNCPTR (gst_sunaudiosink_close);
|
||||
gstaudiosink_class->prepare = GST_DEBUG_FUNCPTR (gst_sunaudiosink_prepare);
|
||||
gstaudiosink_class->unprepare =
|
||||
GST_DEBUG_FUNCPTR (gst_sunaudiosink_unprepare);
|
||||
gstaudiosink_class->write = GST_DEBUG_FUNCPTR (gst_sunaudiosink_write);
|
||||
gstaudiosink_class->delay = GST_DEBUG_FUNCPTR (gst_sunaudiosink_delay);
|
||||
gstaudiosink_class->reset = GST_DEBUG_FUNCPTR (gst_sunaudiosink_reset);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_init (GstSunAudioSink * sunaudiosink)
|
||||
{
|
||||
const char *audiodev;
|
||||
GstClockTime buffer_time;
|
||||
GValue gvalue = { 0, };
|
||||
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "initializing sunaudiosink");
|
||||
|
||||
/*
|
||||
* According to the Sun audio man page, this value can't be set and
|
||||
* will be ignored for playback, but setting it the same way that
|
||||
* esound does. Probably not necessary, but doesn't hurt.
|
||||
*/
|
||||
sunaudiosink->buffer_size = 8180;
|
||||
|
||||
/*
|
||||
* Reset the buffer-time to 3ms instead of the normal default of 500us
|
||||
* (6 times larger, in other words).
|
||||
*
|
||||
* Setting a larger buffer causes the sinesrc to not stutter with this
|
||||
* sink. The fact that SunAudio requires a larger buffer should be
|
||||
* investigated further to see if this is needed due to limitations of
|
||||
* SunAudio itself or because of a more serious problem with the
|
||||
* GStreamer engine on Solaris.
|
||||
*/
|
||||
g_value_init (&gvalue, G_TYPE_INT64);
|
||||
g_object_get_property (G_OBJECT (sunaudiosink), "buffer-time", &gvalue);
|
||||
buffer_time = g_value_get_int64 (&gvalue);
|
||||
if (buffer_time < 3000000) {
|
||||
g_value_set_int64 (&gvalue, 3000000);
|
||||
g_object_set_property (G_OBJECT (sunaudiosink), "buffer-time", &gvalue);
|
||||
}
|
||||
|
||||
audiodev = g_getenv ("AUDIODEV");
|
||||
if (audiodev == NULL)
|
||||
audiodev = DEFAULT_DEVICE;
|
||||
sunaudiosink->device = g_strdup (audiodev);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
GstSunAudioSink *sunaudiosink;
|
||||
|
||||
sunaudiosink = GST_SUNAUDIO_SINK (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_DEVICE:
|
||||
g_free (sunaudiosink->device);
|
||||
sunaudiosink->device = g_strdup (g_value_get_string (value));
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_get_property (GObject * object, guint prop_id,
|
||||
GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
GstSunAudioSink *sunaudiosink;
|
||||
|
||||
sunaudiosink = GST_SUNAUDIO_SINK (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_DEVICE:
|
||||
g_value_set_string (value, sunaudiosink->device);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static GstCaps *
|
||||
gst_sunaudiosink_getcaps (GstBaseSink * bsink)
|
||||
{
|
||||
GstPadTemplate *pad_template;
|
||||
GstCaps *caps = NULL;
|
||||
GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (bsink);
|
||||
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "getcaps called");
|
||||
|
||||
pad_template = gst_static_pad_template_get (&gst_sunaudiosink_factory);
|
||||
caps = gst_caps_copy (gst_pad_template_get_caps (pad_template));
|
||||
|
||||
gst_object_unref (pad_template);
|
||||
|
||||
return caps;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_sunaudiosink_open (GstAudioSink * asink)
|
||||
{
|
||||
GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink);
|
||||
int fd, ret;
|
||||
|
||||
/* First try to open non-blocking */
|
||||
fd = open (sunaudiosink->device, O_WRONLY | O_NONBLOCK);
|
||||
|
||||
if (fd >= 0) {
|
||||
close (fd);
|
||||
fd = open (sunaudiosink->device, O_WRONLY);
|
||||
}
|
||||
|
||||
if (fd == -1) {
|
||||
GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, OPEN_WRITE, (NULL),
|
||||
("can't open connection to Sun Audio device %s", sunaudiosink->device));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sunaudiosink->fd = fd;
|
||||
|
||||
ret = ioctl (fd, AUDIO_GETDEV, &sunaudiosink->dev);
|
||||
if (ret == -1) {
|
||||
GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
|
||||
strerror (errno)));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "name %s", sunaudiosink->dev.name);
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "version %s", sunaudiosink->dev.version);
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "config %s", sunaudiosink->dev.config);
|
||||
|
||||
ret = ioctl (fd, AUDIO_GETINFO, &sunaudiosink->info);
|
||||
if (ret == -1) {
|
||||
GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
|
||||
strerror (errno)));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "monitor_gain %d",
|
||||
sunaudiosink->info.monitor_gain);
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "output_muted %d",
|
||||
sunaudiosink->info.output_muted);
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "hw_features %08x",
|
||||
sunaudiosink->info.hw_features);
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "sw_features %08x",
|
||||
sunaudiosink->info.sw_features);
|
||||
GST_DEBUG_OBJECT (sunaudiosink, "sw_features_enabled %08x",
|
||||
sunaudiosink->info.sw_features_enabled);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_sunaudiosink_close (GstAudioSink * asink)
|
||||
{
|
||||
GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink);
|
||||
|
||||
close (sunaudiosink->fd);
|
||||
sunaudiosink->fd = -1;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_sunaudiosink_prepare (GstAudioSink * asink, GstRingBufferSpec * spec)
|
||||
{
|
||||
GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink);
|
||||
audio_info_t ainfo;
|
||||
int ret;
|
||||
int ports;
|
||||
|
||||
ret = ioctl (sunaudiosink->fd, AUDIO_GETINFO, &ainfo);
|
||||
if (ret == -1) {
|
||||
GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
|
||||
strerror (errno)));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (spec->width != 16)
|
||||
return FALSE;
|
||||
|
||||
ports = ainfo.play.port;
|
||||
if (!(ports & AUDIO_SPEAKER) && (ainfo.play.avail_ports & AUDIO_SPEAKER)) {
|
||||
ports = ports | AUDIO_SPEAKER;
|
||||
}
|
||||
|
||||
AUDIO_INITINFO (&ainfo);
|
||||
|
||||
ainfo.play.sample_rate = spec->rate;
|
||||
ainfo.play.channels = spec->channels;
|
||||
ainfo.play.precision = spec->width;
|
||||
ainfo.play.encoding = AUDIO_ENCODING_LINEAR;
|
||||
ainfo.play.port = ports;
|
||||
ainfo.play.buffer_size = sunaudiosink->buffer_size;
|
||||
ainfo.output_muted = 0;
|
||||
|
||||
ret = ioctl (sunaudiosink->fd, AUDIO_SETINFO, &ainfo);
|
||||
if (ret == -1) {
|
||||
GST_ELEMENT_ERROR (sunaudiosink, RESOURCE, SETTINGS, (NULL), ("%s",
|
||||
strerror (errno)));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_sunaudiosink_unprepare (GstAudioSink * asink)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static guint
|
||||
gst_sunaudiosink_write (GstAudioSink * asink, gpointer data, guint length)
|
||||
{
|
||||
GstSunAudioSink *sunaudiosink = GST_SUNAUDIO_SINK (asink);
|
||||
|
||||
if (length > sunaudiosink->buffer_size)
|
||||
return write (sunaudiosink->fd, data, sunaudiosink->buffer_size);
|
||||
else
|
||||
return write (sunaudiosink->fd, data, length);
|
||||
}
|
||||
|
||||
/*
|
||||
* Should provide the current delay between writing a sample to the
|
||||
* audio device and that sample being actually played. Returning 0 for
|
||||
* now, but this isn't good for synchronization
|
||||
*/
|
||||
static guint
|
||||
gst_sunaudiosink_delay (GstAudioSink * asink)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_sunaudiosink_reset (GstAudioSink * asink)
|
||||
{
|
||||
}
|
63
sys/sunaudio/gstsunaudiosink.h
Normal file
63
sys/sunaudio/gstsunaudiosink.h
Normal file
|
@ -0,0 +1,63 @@
|
|||
/* GStreamer
|
||||
* Copyright (C) 2004 David A. Schleef <ds@schleef.org>
|
||||
* Copyright (C) 2005 Brian Cameron <brian.cameron@sun.com>
|
||||
*
|
||||
* gstsunaudiosink.h:
|
||||
*
|
||||
* 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_SUNAUDIO_SINK_H__
|
||||
#define __GST_SUNAUDIO_SINK_H__
|
||||
|
||||
#include <sys/audioio.h>
|
||||
#include <gst/gst.h>
|
||||
#include <gst/audio/gstaudiosink.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GST_TYPE_SUNAUDIO_SINK (gst_sunaudiosink_get_type())
|
||||
#define GST_SUNAUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SUNAUDIO_SINK,GstSunAudioSink))
|
||||
#define GST_SUNAUDIO_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SUNAUDIO_SINK,GstSunAudioSinkClass))
|
||||
#define GST_IS_SUNAUDIO_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SUNAUDIO_SINK))
|
||||
#define GST_IS_SUNAUDIO_SINK_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SUNAUDIO_SINK))
|
||||
|
||||
typedef struct _GstSunAudioSink GstSunAudioSink;
|
||||
typedef struct _GstSunAudioSinkClass GstSunAudioSinkClass;
|
||||
|
||||
struct _GstSunAudioSink {
|
||||
GstAudioSink sink;
|
||||
|
||||
gchar *device;
|
||||
gint fd;
|
||||
|
||||
audio_device_t dev;
|
||||
audio_info_t info;
|
||||
|
||||
gint bytes_per_sample;
|
||||
gint buffer_size;
|
||||
};
|
||||
|
||||
struct _GstSunAudioSinkClass {
|
||||
GstAudioSinkClass parent_class;
|
||||
};
|
||||
|
||||
GType gst_sunaudiosink_get_type(void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_SUNAUDIO_SINK_H__ */
|
||||
|
Loading…
Reference in a new issue