plugins/mpeg1/mpeg1encoder/Makefile
plugins/mpeg1video/Makefile
plugins/mpeg1video/parse/Makefile
+plugins/oss/Makefile
plugins/rtp/Makefile
plugins/rtp/rtpsend/Makefile
plugins/filters/Makefile
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *videosink;
+ GstElement *disksrc, *osssink, *videosink;
GstElement *bin;
GtkWidget *appwindow;
GstCaps *srccaps;
}
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* and an video sink */
videosink = gst_elementfactory_make("videosink", "play_video");
new_element = gst_autoplug_to_renderers (autoplug,
srccaps,
videosink,
- audiosink,
+ osssink,
NULL);
if (!new_element) {
int main(int argc,char *argv[])
{
- GstElement *bin, *disksrc, *parse, *decoder, *audiosink;
+ GstElement *bin, *disksrc, *parse, *decoder, *osssink;
gst_init(&argc,&argv);
parse = gst_elementfactory_make("mp3parse","parse");
decoder = gst_elementfactory_make("mpg123","decoder");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
+ osssink = gst_elementfactory_make("osssink", "play_audio");
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin), disksrc);
gst_bin_add(GST_BIN(bin), parse);
gst_bin_add(GST_BIN(bin), decoder);
- gst_bin_add(GST_BIN(bin), audiosink);
+ gst_bin_add(GST_BIN(bin), osssink);
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_pad_connect(gst_element_get_pad(parse,"src"),
gst_element_get_pad(decoder,"sink"));
gst_pad_connect(gst_element_get_pad(decoder,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
/* start playing */
gst_element_set_state(bin, GST_STATE_PLAYING);
/* stop the bin */
gst_element_set_state(bin, GST_STATE_NULL);
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(decoder));
gst_object_destroy(GST_OBJECT(disksrc));
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink;
+ GstElement *disksrc, *osssink;
GstElement *pipeline, *thread;
gst_init(&argc,&argv);
GTK_SIGNAL_FUNC(eos),NULL);
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* add objects to the main pipeline */
/*
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
- gst_pipeline_add_sink(GST_PIPELINE(pipeline), audiosink);
+ gst_pipeline_add_sink(GST_PIPELINE(pipeline), osssink);
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("unable to handle stream\n");
#! /bin/sh
for loc in "$@"; do
-../../tools/gstreamer-launch disksrc \""location=$loc"\" ! mp3parse ! mpg123 ! audiosink
+../../tools/gstreamer-launch disksrc \""location=$loc"\" ! mp3parse ! mpg123 ! osssink
done
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *parse, *decode, *queue;
+ GstElement *disksrc, *osssink, *parse, *decode, *queue;
GstElement *bin;
GstElement *thread;
queue = gst_elementfactory_make("queue", "queue");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
gst_bin_use_cothreads (GST_BIN (bin), TRUE);
gst_bin_add(GST_BIN(bin), decode);
gst_bin_add(GST_BIN(bin), queue);
- gst_bin_add(GST_BIN(thread), audiosink);
+ gst_bin_add(GST_BIN(thread), osssink);
gst_bin_add(GST_BIN(bin), thread);
gst_pad_connect(gst_element_get_pad(decode,"src"),
gst_element_get_pad(queue,"sink"));
gst_pad_connect(gst_element_get_pad(queue,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
/* start playing */
gst_element_set_state(GST_ELEMENT(bin), GST_STATE_PLAYING);
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue;
+ GstElement *disksrc, *osssink, *queue;
GstElement *pipeline;
GstElement *thread;
queue = gst_elementfactory_make("queue", "queue");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* add objects to the main pipeline */
/*
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
gst_pipeline_add_sink(GST_PIPELINE(pipeline), queue);
- gst_bin_add(GST_BIN(thread), audiosink);
+ gst_bin_add(GST_BIN(thread), osssink);
gst_pad_connect(gst_element_get_pad(queue,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("cannot autoplug pipeline\n");
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue, *parse, *decode;
+ GstElement *disksrc, *osssink, *queue, *parse, *decode;
GstElement *bin;
GstElement *thread;
queue = gst_elementfactory_make("queue", "queue");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
parse = gst_elementfactory_make("mp3parse", "parse");
decode = gst_elementfactory_make("mpg123", "decode");
gst_bin_add(GST_BIN(thread), parse);
gst_bin_add(GST_BIN(thread), decode);
- gst_bin_add(GST_BIN(thread), audiosink);
+ gst_bin_add(GST_BIN(thread), osssink);
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(queue,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
gst_element_get_pad(decode,"sink"));
gst_pad_connect(gst_element_get_pad(decode,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_bin_add(GST_BIN(bin), thread);
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue, *queue2, *parse, *decode;
+ GstElement *disksrc, *osssink, *queue, *queue2, *parse, *decode;
GstElement *bin;
GstElement *thread, *thread2;
queue2 = gst_elementfactory_make("queue", "queue2");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
parse = gst_elementfactory_make("mp3parse", "parse");
decode = gst_elementfactory_make("mpg123", "decode");
gst_bin_add(GST_BIN(thread), decode);
gst_bin_add(GST_BIN(thread), queue2);
- gst_bin_add(GST_BIN(thread2), audiosink);
+ gst_bin_add(GST_BIN(thread2), osssink);
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(queue,"sink"));
gst_element_get_pad(queue2,"sink"));
gst_pad_connect(gst_element_get_pad(queue2,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_bin_add(GST_BIN(bin), thread);
gst_bin_add(GST_BIN(bin), thread2);
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink;
+ GstElement *disksrc, *osssink;
GstElement *pipeline;
GstElement *thread;
GTK_SIGNAL_FUNC(eos), thread);
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* add objects to the main pipeline */
/*
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
- gst_pipeline_add_sink(GST_PIPELINE(pipeline), audiosink);
+ gst_pipeline_add_sink(GST_PIPELINE(pipeline), osssink);
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("unable to handle stream\n");
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue, *queue2, *parse, *decode;
+ GstElement *disksrc, *osssink, *queue, *queue2, *parse, *decode;
GstElement *bin;
GstElement *thread, *thread2;
queue2 = gst_elementfactory_make("queue", "queue2");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
parse = gst_elementfactory_make("mp3parse", "parse");
decode = gst_elementfactory_make("mpg123", "decode");
gst_bin_add(GST_BIN(thread), decode);
gst_bin_add(GST_BIN(thread), queue2);
- gst_bin_add(GST_BIN(thread2), audiosink);
+ gst_bin_add(GST_BIN(thread2), osssink);
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(queue,"sink"));
gst_element_get_pad(queue2,"sink"));
gst_pad_connect(gst_element_get_pad(queue2,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_bin_add(GST_BIN(bin), thread);
gst_bin_add(GST_BIN(bin), thread2);
# cheap trick to build . first...
-SUBDIRS = . types meta elements autoplug
+SUBDIRS = . types elements autoplug
lib_LTLIBRARIES = libgst.la
gstfakesink.c \
gstdisksrc.c \
gstfdsrc.c \
- gstaudiosink.c \
- gstaudiosrc.c \
gstfdsink.c \
+ gstmultidisksrc.c \
gstpipefilter.c \
gsttee.c \
gstsinesrc.c \
gstfakesink.h \
gstdisksrc.h \
gstfdsrc.h \
+ gstmultidisksrc.h \
gsthttpsrc.h \
- gstaudiosink.h \
- gstaudiosrc.h \
gstfdsink.h \
gstpipefilter.h \
gsttee.h \
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosink.c:
- *
- * 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.
- */
-
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <sys/soundcard.h>
-#include <unistd.h>
-#include <errno.h>
-
-//#define DEBUG_ENABLED
-
-#include <gstaudiosink.h>
-#include <gst/meta/audioraw.h>
-
-
-GstElementDetails gst_audiosink_details = {
- "Audio Sink (OSS)",
- "Sink/Audio",
- "Output to a sound card via OSS",
- VERSION,
- "Erik Walthinsen <omega@cse.ogi.edu>",
- "(C) 1999",
-};
-
-static void gst_audiosink_class_init (GstAudioSinkClass *klass);
-static void gst_audiosink_init (GstAudioSink *audiosink);
-
-static gboolean gst_audiosink_open_audio (GstAudioSink *sink);
-static void gst_audiosink_close_audio (GstAudioSink *sink);
-static void gst_audiosink_sync_parms (GstAudioSink *audiosink);
-static GstElementStateReturn gst_audiosink_change_state (GstElement *element);
-static GstPadNegotiateReturn gst_audiosink_negotiate (GstPad *pad, GstCaps **caps, gint counter);
-
-static void gst_audiosink_set_arg (GtkObject *object, GtkArg *arg, guint id);
-static void gst_audiosink_get_arg (GtkObject *object, GtkArg *arg, guint id);
-
-static void gst_audiosink_chain (GstPad *pad,GstBuffer *buf);
-
-/* AudioSink signals and args */
-enum {
- SIGNAL_HANDOFF,
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_MUTE,
- ARG_FORMAT,
- ARG_CHANNELS,
- ARG_FREQUENCY,
- /* FILL ME */
-};
-
-static GstPadFactory audiosink_sink_factory = {
- "sink",
- GST_PAD_FACTORY_SINK,
- GST_PAD_FACTORY_ALWAYS,
- GST_PAD_FACTORY_CAPS (
- "audiosink_sink",
- "audio/raw",
- "format", GST_PROPS_INT (AFMT_S16_LE),
- "depth", GST_PROPS_LIST (
- GST_PROPS_INT (8),
- GST_PROPS_INT (16)
- ),
- "rate", GST_PROPS_INT_RANGE (8000, 48000),
- "channels", GST_PROPS_INT_RANGE (1, 2)
- ),
- NULL
-};
-
-#define GST_TYPE_AUDIOSINK_FORMATS (gst_audiosink_formats_get_type())
-
-static GtkType
-gst_audiosink_formats_get_type(void) {
- static GtkType audiosink_formats_type = 0;
- static GtkEnumValue audiosink_formats[] = {
- {8, "8", "8 Bits"},
- {16, "16", "16 Bits"},
- {0, NULL, NULL},
- };
- if (!audiosink_formats_type) {
- audiosink_formats_type = gtk_type_register_enum("GstAudiosinkFormats", audiosink_formats);
- }
- return audiosink_formats_type;
-}
-
-#define GST_TYPE_AUDIOSINK_CHANNELS (gst_audiosink_channels_get_type())
-
-static GtkType
-gst_audiosink_channels_get_type(void) {
- static GtkType audiosink_channels_type = 0;
- static GtkEnumValue audiosink_channels[] = {
- {1, "1", "Mono"},
- {2, "2", "Stereo"},
- {0, NULL, NULL},
- };
- if (!audiosink_channels_type) {
- audiosink_channels_type = gtk_type_register_enum("GstAudiosinkChannels", audiosink_channels);
- }
- return audiosink_channels_type;
-}
-
-
-static GstElementClass *parent_class = NULL;
-static guint gst_audiosink_signals[LAST_SIGNAL] = { 0 };
-
-static GstPadTemplate *gst_audiosink_sink_template;
-
-GtkType
-gst_audiosink_get_type (void)
-{
- static GtkType audiosink_type = 0;
-
- if (!audiosink_type) {
- static const GtkTypeInfo audiosink_info = {
- "GstAudioSink",
- sizeof(GstAudioSink),
- sizeof(GstAudioSinkClass),
- (GtkClassInitFunc)gst_audiosink_class_init,
- (GtkObjectInitFunc)gst_audiosink_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL,
- (GtkClassInitFunc)NULL,
- };
- audiosink_type = gtk_type_unique (GST_TYPE_ELEMENT, &audiosink_info);
- }
-
- return audiosink_type;
-}
-
-static void
-gst_audiosink_class_init (GstAudioSinkClass *klass)
-{
- GtkObjectClass *gtkobject_class;
- GstElementClass *gstelement_class;
-
- gtkobject_class = (GtkObjectClass*)klass;
- gstelement_class = (GstElementClass*)klass;
-
- parent_class = gtk_type_class(GST_TYPE_ELEMENT);
-
- gtk_object_add_arg_type ("GstAudioSink::mute", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_MUTE);
- gtk_object_add_arg_type ("GstAudioSink::format", GST_TYPE_AUDIOSINK_FORMATS,
- GTK_ARG_READWRITE, ARG_FORMAT);
- gtk_object_add_arg_type ("GstAudioSink::channels", GST_TYPE_AUDIOSINK_CHANNELS,
- GTK_ARG_READWRITE, ARG_CHANNELS);
- gtk_object_add_arg_type ("GstAudioSink::frequency", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_FREQUENCY);
-
- gtkobject_class->set_arg = gst_audiosink_set_arg;
- gtkobject_class->get_arg = gst_audiosink_get_arg;
-
- gst_audiosink_signals[SIGNAL_HANDOFF] =
- gtk_signal_new("handoff",GTK_RUN_LAST,gtkobject_class->type,
- GTK_SIGNAL_OFFSET(GstAudioSinkClass,handoff),
- gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0);
-
- gtk_object_class_add_signals(gtkobject_class,gst_audiosink_signals,
- LAST_SIGNAL);
-
- gstelement_class->change_state = gst_audiosink_change_state;
-}
-
-static void
-gst_audiosink_init (GstAudioSink *audiosink)
-{
- audiosink->sinkpad = gst_pad_new_from_template (gst_audiosink_sink_template, "sink");
- gst_element_add_pad (GST_ELEMENT (audiosink), audiosink->sinkpad);
- gst_pad_set_negotiate_function (audiosink->sinkpad, gst_audiosink_negotiate);
-
- gst_pad_set_chain_function (audiosink->sinkpad, gst_audiosink_chain);
-
- audiosink->fd = -1;
- audiosink->clock = gst_clock_get_system();
- audiosink->format = 16;
- audiosink->channels = 2;
- audiosink->frequency = 44100;
-
- gst_clock_register (audiosink->clock, GST_OBJECT (audiosink));
-
- GST_FLAG_SET (audiosink, GST_ELEMENT_THREAD_SUGGESTED);
-}
-
-static GstPadNegotiateReturn
-gst_audiosink_negotiate (GstPad *pad, GstCaps **caps, gint counter)
-{
- GstAudioSink *audiosink;
-
- g_return_val_if_fail (pad != NULL, GST_PAD_NEGOTIATE_FAIL);
- g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_NEGOTIATE_FAIL);
-
- audiosink = GST_AUDIOSINK (gst_pad_get_parent (pad));
-
- g_print ("audiosink: negotiate\n");
- // we decide
- if (counter == 0) {
- *caps = NULL;
- return GST_PAD_NEGOTIATE_TRY;
- }
- // have we got caps?
- else if (*caps) {
- if (audiosink->fd == -1) return GST_PAD_NEGOTIATE_FAIL;
-
- audiosink->format = gst_caps_get_int (*caps, "format");
- audiosink->channels = gst_caps_get_int (*caps, "channels");
- audiosink->frequency = gst_caps_get_int (*caps, "rate");
-
- gst_audiosink_sync_parms (audiosink);
-
- // FIXME check if the qound card was really set to these caps,
- // else send out another caps..
-
- return GST_PAD_NEGOTIATE_AGREE;
- }
-
- return GST_PAD_NEGOTIATE_FAIL;
-}
-
-static void
-gst_audiosink_sync_parms (GstAudioSink *audiosink)
-{
- audio_buf_info ospace;
- int frag;
-
- g_return_if_fail (audiosink != NULL);
- g_return_if_fail (GST_IS_AUDIOSINK (audiosink));
-
- if (audiosink->fd == -1) return;
-
- ioctl (audiosink->fd, SNDCTL_DSP_RESET, 0);
-
- ioctl (audiosink->fd, SNDCTL_DSP_SETFMT, &audiosink->format);
- ioctl (audiosink->fd, SNDCTL_DSP_CHANNELS, &audiosink->channels);
- ioctl (audiosink->fd, SNDCTL_DSP_SPEED, &audiosink->frequency);
- ioctl (audiosink->fd, SNDCTL_DSP_GETBLKSIZE, &frag);
-
- ioctl (audiosink->fd, SNDCTL_DSP_GETOSPACE, &ospace);
-
- g_print("audiosink: setting sound card to %dHz %d bit %s (%d bytes buffer, %d fragment)\n",
- audiosink->frequency, audiosink->format,
- (audiosink->channels == 2) ? "stereo" : "mono", ospace.bytes, frag);
-
-}
-
-static void
-gst_audiosink_chain (GstPad *pad, GstBuffer *buf)
-{
- GstAudioSink *audiosink;
- gboolean in_flush;
- audio_buf_info ospace;
-
- g_return_if_fail (pad != NULL);
- g_return_if_fail (GST_IS_PAD (pad));
- g_return_if_fail (buf != NULL);
-
-
- /* this has to be an audio buffer */
-// g_return_if_fail(((GstMeta *)buf->meta)->type !=
-//gst_audiosink_type_audio);
- audiosink = GST_AUDIOSINK (gst_pad_get_parent (pad));
-// g_return_if_fail(GST_FLAG_IS_SET(audiosink,GST_STATE_RUNNING));
-
- if ((in_flush = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLUSH))) {
- GST_DEBUG (0,"audiosink: flush\n");
- ioctl (audiosink->fd, SNDCTL_DSP_RESET, 0);
- }
-
- gtk_signal_emit (GTK_OBJECT (audiosink), gst_audiosink_signals[SIGNAL_HANDOFF],
- audiosink);
-
- if (GST_BUFFER_DATA (buf) != NULL) {
- gst_trace_add_entry(NULL, 0, buf, "audiosink: writing to soundcard");
- //g_print("audiosink: writing to soundcard\n");
- if (audiosink->fd >= 0) {
- if (!audiosink->mute) {
- gst_clock_wait (audiosink->clock, GST_BUFFER_TIMESTAMP (buf), GST_OBJECT (audiosink));
- ioctl (audiosink->fd, SNDCTL_DSP_GETOSPACE, &ospace);
- GST_DEBUG (0,"audiosink: (%d bytes buffer) %d %p %d\n", ospace.bytes,
- audiosink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
- write (audiosink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
- //write(STDOUT_FILENO,GST_BUFFER_DATA(buf),GST_BUFFER_SIZE(buf));
- }
- }
- }
- gst_buffer_unref (buf);
-}
-
-static void
-gst_audiosink_set_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSink *audiosink;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSINK (object));
-
- audiosink = GST_AUDIOSINK (object);
-
- switch(id) {
- case ARG_MUTE:
- audiosink->mute = GTK_VALUE_BOOL (*arg);
- break;
- case ARG_FORMAT:
- audiosink->format = GTK_VALUE_ENUM (*arg);
- gst_audiosink_sync_parms (audiosink);
- break;
- case ARG_CHANNELS:
- audiosink->channels = GTK_VALUE_ENUM (*arg);
- gst_audiosink_sync_parms (audiosink);
- break;
- case ARG_FREQUENCY:
- audiosink->frequency = GTK_VALUE_INT (*arg);
- gst_audiosink_sync_parms (audiosink);
- break;
- default:
- break;
- }
-}
-
-static void
-gst_audiosink_get_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSink *audiosink;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSINK (object));
-
- audiosink = GST_AUDIOSINK (object);
-
- switch(id) {
- case ARG_MUTE:
- GTK_VALUE_BOOL (*arg) = audiosink->mute;
- break;
- case ARG_FORMAT:
- GTK_VALUE_ENUM (*arg) = audiosink->format;
- break;
- case ARG_CHANNELS:
- GTK_VALUE_ENUM (*arg) = audiosink->channels;
- break;
- case ARG_FREQUENCY:
- GTK_VALUE_INT (*arg) = audiosink->frequency;
- break;
- default:
- break;
- }
-}
-
-static gboolean
-gst_audiosink_open_audio (GstAudioSink *sink)
-{
- g_return_val_if_fail (sink->fd == -1, FALSE);
-
- g_print ("audiosink: attempting to open sound device\n");
-
- /* first try to open the sound card */
- sink->fd = open("/dev/dsp", O_WRONLY | O_NONBLOCK);
- if (errno == EBUSY) {
- g_print ("audiosink: unable to open the sound device (in use ?)\n");
- return FALSE;
- }
-
- /* re-open the sound device in blocking mode */
- close(sink->fd);
- sink->fd = open("/dev/dsp", O_WRONLY);
-
- /* if we have it, set the default parameters and go have fun */
- if (sink->fd >= 0) {
- /* set card state */
- ioctl(sink->fd, SNDCTL_DSP_GETCAPS, &sink->caps);
-
- g_print("audiosink: Capabilities\n");
-
- if (sink->caps & DSP_CAP_DUPLEX) g_print("audiosink: Full duplex\n");
- if (sink->caps & DSP_CAP_REALTIME) g_print("audiosink: Realtime\n");
- if (sink->caps & DSP_CAP_BATCH) g_print("audiosink: Batch\n");
- if (sink->caps & DSP_CAP_COPROC) g_print("audiosink: Has coprocessor\n");
- if (sink->caps & DSP_CAP_TRIGGER) g_print("audiosink: Trigger\n");
- if (sink->caps & DSP_CAP_MMAP) g_print("audiosink: Direct access\n");
-
- g_print("audiosink: opened audio with fd=%d\n", sink->fd);
- GST_FLAG_SET (sink, GST_AUDIOSINK_OPEN);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gst_audiosink_close_audio (GstAudioSink *sink)
-{
- if (sink->fd < 0) return;
-
- close(sink->fd);
- sink->fd = -1;
-
- GST_FLAG_UNSET (sink, GST_AUDIOSINK_OPEN);
-
- g_print("audiosink: closed sound device\n");
-}
-
-static GstElementStateReturn
-gst_audiosink_change_state (GstElement *element)
-{
- g_return_val_if_fail (GST_IS_AUDIOSINK (element), FALSE);
-
- /* if going down into NULL state, close the file if it's open */
- if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
- if (GST_FLAG_IS_SET (element, GST_AUDIOSINK_OPEN))
- gst_audiosink_close_audio (GST_AUDIOSINK (element));
- /* otherwise (READY or higher) we need to open the sound card */
- } else {
- if (!GST_FLAG_IS_SET (element, GST_AUDIOSINK_OPEN)) {
- if (!gst_audiosink_open_audio (GST_AUDIOSINK (element))) {
- //return GST_STATE_FAILURE;
- }
- }
- }
-
- if (GST_ELEMENT_CLASS (parent_class)->change_state)
- return GST_ELEMENT_CLASS (parent_class)->change_state (element);
- return GST_STATE_SUCCESS;
-}
-
-gboolean
-gst_audiosink_factory_init (GstElementFactory *factory)
-{
- gst_audiosink_sink_template = gst_padtemplate_new (&audiosink_sink_factory);
- gst_elementfactory_add_padtemplate (factory, gst_audiosink_sink_template);
-
- return TRUE;
-}
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosink.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_AUDIOSINK_H__
-#define __GST_AUDIOSINK_H__
-
-
-#include <config.h>
-#include <gst/gst.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-GstElementDetails gst_audiosink_details;
-
-
-#define GST_TYPE_AUDIOSINK \
- (gst_audiosink_get_type())
-#define GST_AUDIOSINK(obj) \
- (GTK_CHECK_CAST((obj),GST_TYPE_AUDIOSINK,GstAudioSink))
-#define GST_AUDIOSINK_CLASS(klass) \
- (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOSINK,GstAudioSinkClass))
-#define GST_IS_AUDIOSINK(obj) \
- (GTK_CHECK_TYPE((obj),GST_TYPE_AUDIOSINK))
-#define GST_IS_AUDIOSINK_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOSINK))
-
-typedef enum {
- GST_AUDIOSINK_OPEN = GST_ELEMENT_FLAG_LAST,
-
- GST_AUDIOSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2,
-} GstAudioSinkFlags;
-
-typedef struct _GstAudioSink GstAudioSink;
-typedef struct _GstAudioSinkClass GstAudioSinkClass;
-
-struct _GstAudioSink {
- GstElement element;
-
- GstPad *sinkpad;
-
- //GstClockTime clocktime;
- GstClock *clock;
- /* soundcard state */
- int fd;
- int caps; /* the capabilities */
- gint format;
- gint channels;
- gint frequency;
- gboolean mute;
-};
-
-struct _GstAudioSinkClass {
- GstElementClass parent_class;
-
- /* signals */
- void (*handoff) (GstElement *element,GstPad *pad);
-};
-
-GtkType gst_audiosink_get_type(void);
-
-gboolean gst_audiosink_factory_init(GstElementFactory *factory);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __GST_AUDIOSINK_H__ */
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosrc.c:
- *
- * 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.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/soundcard.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-
-#include <gstaudiosrc.h>
-
-
-GstElementDetails gst_audiosrc_details = {
- "Audio (OSS) Source",
- "Source/Audio",
- "Read from the sound card",
- VERSION,
- "Erik Walthinsen <omega@cse.ogi.edu>",
- "(C) 1999",
-};
-
-
-/* AudioSrc signals and args */
-enum {
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_BYTESPERREAD,
- ARG_CUROFFSET,
- ARG_FORMAT,
- ARG_CHANNELS,
- ARG_FREQUENCY,
-};
-
-
-static void gst_audiosrc_class_init (GstAudioSrcClass *klass);
-static void gst_audiosrc_init (GstAudioSrc *audiosrc);
-
-static void gst_audiosrc_set_arg (GtkObject *object, GtkArg *arg, guint id);
-static void gst_audiosrc_get_arg (GtkObject *object, GtkArg *arg, guint id);
-static GstElementStateReturn gst_audiosrc_change_state (GstElement *element);
-
-static void gst_audiosrc_close_audio (GstAudioSrc *src);
-static gboolean gst_audiosrc_open_audio (GstAudioSrc *src);
-static void gst_audiosrc_sync_parms (GstAudioSrc *audiosrc);
-
-static GstBuffer * gst_audiosrc_get (GstPad *pad);
-
-static GstElementClass *parent_class = NULL;
-//static guint gst_audiosrc_signals[LAST_SIGNAL] = { 0 };
-
-GtkType
-gst_audiosrc_get_type (void)
-{
- static GtkType audiosrc_type = 0;
-
- if (!audiosrc_type) {
- static const GtkTypeInfo audiosrc_info = {
- "GstAudioSrc",
- sizeof(GstAudioSrc),
- sizeof(GstAudioSrcClass),
- (GtkClassInitFunc)gst_audiosrc_class_init,
- (GtkObjectInitFunc)gst_audiosrc_init,
- (GtkArgSetFunc)gst_audiosrc_set_arg,
- (GtkArgGetFunc)gst_audiosrc_get_arg,
- (GtkClassInitFunc)NULL,
- };
- audiosrc_type = gtk_type_unique (GST_TYPE_ELEMENT, &audiosrc_info);
- }
- return audiosrc_type;
-}
-
-static void
-gst_audiosrc_class_init (GstAudioSrcClass *klass)
-{
- GtkObjectClass *gtkobject_class;
- GstElementClass *gstelement_class;
-
- gtkobject_class = (GtkObjectClass*)klass;
- gstelement_class = (GstElementClass*)klass;
-
- parent_class = gtk_type_class (GST_TYPE_ELEMENT);
-
- gtk_object_add_arg_type ("GstAudioSrc::bytes_per_read", GTK_TYPE_ULONG,
- GTK_ARG_READWRITE, ARG_BYTESPERREAD);
- gtk_object_add_arg_type ("GstAudioSrc::curoffset", GTK_TYPE_ULONG,
- GTK_ARG_READABLE, ARG_CUROFFSET);
- gtk_object_add_arg_type ("GstAudioSrc::format", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_FORMAT);
- gtk_object_add_arg_type ("GstAudioSrc::channels", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CHANNELS);
- gtk_object_add_arg_type ("GstAudioSrc::frequency", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_FREQUENCY);
-
- gtkobject_class->set_arg = gst_audiosrc_set_arg;
- gtkobject_class->get_arg = gst_audiosrc_get_arg;
-
- gstelement_class->change_state = gst_audiosrc_change_state;
-}
-
-static void
-gst_audiosrc_init (GstAudioSrc *audiosrc)
-{
- audiosrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
- gst_pad_set_get_function(audiosrc->srcpad,gst_audiosrc_get);
- gst_element_add_pad (GST_ELEMENT (audiosrc), audiosrc->srcpad);
-
- audiosrc->fd = -1;
-
-// audiosrc->meta = (MetaAudioRaw *)gst_meta_new();
-// audiosrc->meta->format = AFMT_S16_LE;
-// audiosrc->meta->channels = 2;
-// audiosrc->meta->frequency = 44100;
-// audiosrc->meta->bps = 4;
-
- audiosrc->bytes_per_read = 4096;
- audiosrc->curoffset = 0;
- audiosrc->seq = 0;
-}
-
-static GstBuffer *
-gst_audiosrc_get (GstPad *pad)
-{
- GstAudioSrc *src;
- GstBuffer *buf;
- glong readbytes;
-
- g_return_val_if_fail (pad != NULL, NULL);
- src = GST_AUDIOSRC(gst_pad_get_parent (pad));
-
-// g_print("attempting to read something from soundcard\n");
-
- buf = gst_buffer_new ();
- g_return_val_if_fail (buf, NULL);
-
- GST_BUFFER_DATA (buf) = (gpointer)g_malloc (src->bytes_per_read);
-
- readbytes = read (src->fd,GST_BUFFER_DATA (buf),
- src->bytes_per_read);
-
- if (readbytes == 0) {
- gst_element_signal_eos (GST_ELEMENT (src));
- return NULL;
- }
-
- GST_BUFFER_SIZE (buf) = readbytes;
- GST_BUFFER_OFFSET (buf) = src->curoffset;
-
- src->curoffset += readbytes;
-
-// gst_buffer_add_meta(buf,GST_META(newmeta));
-
-// g_print("pushed buffer from soundcard of %d bytes\n",readbytes);
- return buf;
-}
-
-static void
-gst_audiosrc_set_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSrc *src;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSRC (object));
-
- src = GST_AUDIOSRC (object);
-
- switch (id) {
- case ARG_BYTESPERREAD:
- src->bytes_per_read = GTK_VALUE_INT (*arg);
- break;
- case ARG_FORMAT:
- src->format = GTK_VALUE_INT (*arg);
- break;
- case ARG_CHANNELS:
- src->channels = GTK_VALUE_INT (*arg);
- break;
- case ARG_FREQUENCY:
- src->frequency = GTK_VALUE_INT (*arg);
- break;
- default:
- break;
- }
-}
-
-static void
-gst_audiosrc_get_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSrc *src;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSRC (object));
-
- src = GST_AUDIOSRC (object);
-
- switch (id) {
- case ARG_BYTESPERREAD:
- GTK_VALUE_INT (*arg) = src->bytes_per_read;
- break;
- case ARG_FORMAT:
- GTK_VALUE_INT (*arg) = src->format;
- break;
- case ARG_CHANNELS:
- GTK_VALUE_INT (*arg) = src->channels;
- break;
- case ARG_FREQUENCY:
- GTK_VALUE_INT (*arg) = src->frequency;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static GstElementStateReturn
-gst_audiosrc_change_state (GstElement *element)
-{
- g_return_val_if_fail (GST_IS_AUDIOSRC (element), FALSE);
-
- /* if going down into NULL state, close the file if it's open */
- if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
- if (GST_FLAG_IS_SET (element, GST_AUDIOSRC_OPEN))
- gst_audiosrc_close_audio (GST_AUDIOSRC (element));
- /* otherwise (READY or higher) we need to open the sound card */
- } else {
- if (!GST_FLAG_IS_SET (element, GST_AUDIOSRC_OPEN)) {
- if (!gst_audiosrc_open_audio (GST_AUDIOSRC (element)))
- return GST_STATE_FAILURE;
- }
- }
-
- if (GST_ELEMENT_CLASS (parent_class)->change_state)
- return GST_ELEMENT_CLASS (parent_class)->change_state (element);
-
- return GST_STATE_SUCCESS;
-}
-
-static gboolean
-gst_audiosrc_open_audio (GstAudioSrc *src)
-{
- g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_AUDIOSRC_OPEN), FALSE);
-
- /* first try to open the sound card */
- src->fd = open("/dev/dsp", O_RDONLY);
-
- /* if we have it, set the default parameters and go have fun */
- if (src->fd > 0) {
- int arg = 0x7fff0006;
-
- if (ioctl (src->fd, SNDCTL_DSP_SETFRAGMENT, &arg)) perror("uh");
-
- /* set card state */
- gst_audiosrc_sync_parms (src);
- GST_DEBUG (0,"opened audio\n");
-
- GST_FLAG_SET (src, GST_AUDIOSRC_OPEN);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gst_audiosrc_close_audio (GstAudioSrc *src)
-{
- g_return_if_fail (GST_FLAG_IS_SET (src, GST_AUDIOSRC_OPEN));
-
- close(src->fd);
- src->fd = -1;
-
- GST_FLAG_UNSET (src, GST_AUDIOSRC_OPEN);
-}
-
-static void
-gst_audiosrc_sync_parms (GstAudioSrc *audiosrc)
-{
- audio_buf_info ospace;
-
- g_return_if_fail (audiosrc != NULL);
- g_return_if_fail (GST_IS_AUDIOSRC (audiosrc));
- g_return_if_fail (audiosrc->fd > 0);
-
- ioctl(audiosrc->fd, SNDCTL_DSP_RESET, 0);
-
- ioctl(audiosrc->fd, SNDCTL_DSP_SETFMT, &audiosrc->format);
- ioctl(audiosrc->fd, SNDCTL_DSP_CHANNELS, &audiosrc->channels);
- ioctl(audiosrc->fd, SNDCTL_DSP_SPEED, &audiosrc->frequency);
-
- ioctl(audiosrc->fd, SNDCTL_DSP_GETOSPACE, &ospace);
-
- g_print("setting sound card to %dKHz %d bit %s (%d bytes buffer)\n",
- audiosrc->frequency,audiosrc->format,
- (audiosrc->channels == 2) ? "stereo" : "mono",ospace.bytes);
-
-// audiosrc->meta.format = audiosrc->format;
-// audiosrc->meta.channels = audiosrc->channels;
-// audiosrc->meta.frequency = audiosrc->frequency;
-// audiosrc->sentmeta = FALSE;
-}
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosrc.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_AUDIOSRC_H__
-#define __GST_AUDIOSRC_H__
-
-
-#include <config.h>
-#include <gst/gst.h>
-#include <gst/meta/audioraw.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-GstElementDetails gst_audiosrc_details;
-
-
-#define GST_TYPE_AUDIOSRC \
- (gst_audiosrc_get_type())
-#define GST_AUDIOSRC(obj) \
- (GTK_CHECK_CAST((obj),GST_TYPE_AUDIOSRC,GstAudioSrc))
-#define GST_AUDIOSRC_CLASS(klass) \
- (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOSRC,GstAudioSrcClass))
-#define GST_IS_AUDIOSRC(obj) \
- (GTK_CHECK_TYPE((obj),GST_TYPE_AUDIOSRC))
-#define GST_IS_AUDIOSRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOSRC))
-
-typedef enum {
- GST_AUDIOSRC_OPEN = GST_ELEMENT_FLAG_LAST,
-
- GST_AUDIOSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2,
-} GstAudioSrcFlags;
-
-typedef struct _GstAudioSrc GstAudioSrc;
-typedef struct _GstAudioSrcClass GstAudioSrcClass;
-
-struct _GstAudioSrc {
- GstElement element;
-
- /* pads */
- GstPad *srcpad;
-
- /* sound card */
- gint fd;
-
- /* audio parameters */
- gint format;
- gint channels;
- gint frequency;
-
- /* blocking */
- gulong curoffset;
- gulong bytes_per_read;
-
- gulong seq;
-
- MetaAudioRaw *meta;
-};
-
-struct _GstAudioSrcClass {
- GstElementClass parent_class;
-};
-
-GtkType gst_audiosrc_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __GST_AUDIOSRC_H__ */
#include <gst/gst.h>
-#include "gstaudiosink.h"
-#include "gstaudiosrc.h"
#include "gstdisksrc.h"
#include "gstidentity.h"
#include "gstfakesink.h"
#include "gstfakesrc.h"
#include "gstfdsink.h"
#include "gstfdsrc.h"
+#include "gstmultidisksrc.h"
#include "gstpipefilter.h"
#include "gstsinesrc.h"
#include "gsttee.h"
static struct _elements_entry _elements[] = {
{ "fakesrc", gst_fakesrc_get_type, &gst_fakesrc_details, NULL },
{ "fakesink", gst_fakesink_get_type, &gst_fakesink_details, NULL },
- { "audiosink", gst_audiosink_get_type, &gst_audiosink_details, gst_audiosink_factory_init },
- { "audiosrc", gst_audiosrc_get_type, &gst_audiosrc_details, NULL },
{ "disksrc", gst_disksrc_get_type, &gst_disksrc_details, NULL },
{ "identity", gst_identity_get_type, &gst_identity_details, NULL },
{ "fdsink", gst_fdsink_get_type, &gst_fdsink_details, NULL },
{ "fdsrc", gst_fdsrc_get_type, &gst_fdsrc_details, NULL },
+ { "multidisksrc", gst_multidisksrc_get_type, &gst_multidisksrc_details, NULL },
{ "pipefilter", gst_pipefilter_get_type, &gst_pipefilter_details, NULL },
{ "sinesrc", gst_sinesrc_get_type, &gst_sinesrc_details, NULL },
{ "tee", gst_tee_get_type, &gst_tee_details, gst_tee_factory_init },
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.c:
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+//#define GST_DEBUG_ENABLED
+
+#include "gstmultidisksrc.h"
+
+GstElementDetails gst_multidisksrc_details = {
+ "Multi Disk Source",
+ "Source/File",
+ "Read from multiple files in order",
+ VERSION,
+ "Dominic Ludlam <dom@openfx.org>",
+ "(C) 2001",
+};
+
+/* DiskSrc signals and args */
+enum {
+ NEW_FILE,
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_LOCATIONS,
+};
+
+static void gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass);
+static void gst_multidisksrc_init (GstMultiDiskSrc *disksrc);
+
+static void gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id);
+static void gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id);
+
+static GstBuffer * gst_multidisksrc_get (GstPad *pad);
+//static GstBuffer * gst_multidisksrc_get_region (GstPad *pad,GstRegionType type,guint64 offset,guint64 len);
+
+static GstElementStateReturn gst_multidisksrc_change_state (GstElement *element);
+
+static gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad);
+static void gst_multidisksrc_close_file (GstMultiDiskSrc *src);
+
+static GstElementClass *parent_class = NULL;
+static guint gst_multidisksrc_signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+gst_multidisksrc_get_type(void)
+{
+ static GtkType multidisksrc_type = 0;
+
+ if (!multidisksrc_type) {
+ static const GtkTypeInfo multidisksrc_info = {
+ "GstMultiDiskSrc",
+ sizeof(GstMultiDiskSrc),
+ sizeof(GstMultiDiskSrcClass),
+ (GtkClassInitFunc)gst_multidisksrc_class_init,
+ (GtkObjectInitFunc)gst_multidisksrc_init,
+ (GtkArgSetFunc)gst_multidisksrc_set_arg,
+ (GtkArgGetFunc)gst_multidisksrc_get_arg,
+ (GtkClassInitFunc)NULL,
+ };
+ multidisksrc_type = gtk_type_unique (GST_TYPE_ELEMENT, &multidisksrc_info);
+ }
+ return multidisksrc_type;
+}
+
+static void
+gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass)
+{
+ GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
+
+ gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = gtk_type_class (GST_TYPE_ELEMENT);
+
+ gst_multidisksrc_signals[NEW_FILE] =
+ gtk_signal_new ("new_file", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstMultiDiskSrcClass, new_file),
+ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
+ GTK_TYPE_POINTER);
+ gtk_object_class_add_signals (gtkobject_class, gst_multidisksrc_signals, LAST_SIGNAL);
+
+ gtk_object_add_arg_type ("GstMultiDiskSrc::locations", GTK_TYPE_POINTER,
+ GTK_ARG_READWRITE, ARG_LOCATIONS);
+
+ gtkobject_class->set_arg = gst_multidisksrc_set_arg;
+ gtkobject_class->get_arg = gst_multidisksrc_get_arg;
+
+ gstelement_class->change_state = gst_multidisksrc_change_state;
+}
+
+static void
+gst_multidisksrc_init (GstMultiDiskSrc *multidisksrc)
+{
+// GST_FLAG_SET (disksrc, GST_SRC_);
+
+ multidisksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_get_function (multidisksrc->srcpad,gst_multidisksrc_get);
+// gst_pad_set_getregion_function (multidisksrc->srcpad,gst_multidisksrc_get_region);
+ gst_element_add_pad (GST_ELEMENT (multidisksrc), multidisksrc->srcpad);
+
+ multidisksrc->listptr = NULL;
+ multidisksrc->currentfilename = NULL;
+ multidisksrc->fd = 0;
+ multidisksrc->size = 0;
+ multidisksrc->map = NULL;
+ multidisksrc->new_seek = FALSE;
+}
+
+static void
+gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch(id) {
+ case ARG_LOCATIONS:
+ /* the element must be stopped in order to do this */
+ g_return_if_fail (GST_STATE (src) < GST_STATE_PLAYING);
+
+ /* clear the filename if we get a NULL */
+ if (GTK_VALUE_POINTER (*arg) == NULL) {
+ gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
+ src->listptr = NULL;
+ /* otherwise set the new filenames */
+ } else {
+ src->listptr = GTK_VALUE_POINTER(*arg);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch (id) {
+ case ARG_LOCATIONS:
+ GTK_VALUE_POINTER (*arg) = src->listptr;
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/**
+ * gst_disksrc_get:
+ * @pad: #GstPad to push a buffer from
+ *
+ * Push a new buffer from the disksrc at the current offset.
+ */
+static GstBuffer *
+gst_multidisksrc_get (GstPad *pad)
+{
+ GstMultiDiskSrc *src;
+ GstBuffer *buf;
+ GSList *list;
+
+ g_return_val_if_fail (pad != NULL, NULL);
+ src = GST_MULTIDISKSRC (gst_pad_get_parent (pad));
+
+ if (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file(src);
+
+ if (!src->listptr) {
+ gst_pad_set_eos(pad);
+ return FALSE;
+ }
+
+ list = src->listptr;
+ src->currentfilename = (gchar *) list->data;
+ src->listptr = src->listptr->next;
+
+ if (!gst_multidisksrc_open_file(src, pad))
+ return NULL;
+
+ // emitted after the open, as the user may free the list and string from here
+ gtk_signal_emit(GTK_OBJECT(src), gst_multidisksrc_signals[NEW_FILE], list);
+
+ /* create the buffer */
+ // FIXME: should eventually use a bufferpool for this
+ buf = gst_buffer_new ();
+
+ g_return_val_if_fail (buf != NULL, NULL);
+
+ /* simply set the buffer to point to the correct region of the file */
+ GST_BUFFER_DATA (buf) = src->map;
+ GST_BUFFER_OFFSET (buf) = 0;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
+
+ if (src->new_seek) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLUSH);
+ src->new_seek = FALSE;
+ }
+
+ /* we're done, return the buffer */
+ return buf;
+}
+
+/* open the file and mmap it, necessary to go to READY state */
+static
+gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad)
+{
+ g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN), FALSE);
+
+ /* open the file */
+ src->fd = open ((const char *) src->currentfilename, O_RDONLY);
+
+ if (src->fd < 0) {
+ perror ("open");
+ gst_element_error (GST_ELEMENT (src), g_strconcat("opening file \"", src->currentfilename, "\"", NULL));
+ return FALSE;
+ } else {
+ /* find the file length */
+ src->size = lseek (src->fd, 0, SEEK_END);
+ lseek (src->fd, 0, SEEK_SET);
+ /* map the file into memory */
+ src->map = mmap (NULL, src->size, PROT_READ, MAP_SHARED, src->fd, 0);
+ madvise (src->map,src->size, 2);
+ /* collapse state if that failed */
+ if (src->map == NULL) {
+ close (src->fd);
+ gst_element_error (GST_ELEMENT (src),"mmapping file");
+ return FALSE;
+ }
+ GST_FLAG_SET (src, GST_MULTIDISKSRC_OPEN);
+ src->new_seek = TRUE;
+ }
+ return TRUE;
+}
+
+/* unmap and close the file */
+static void
+gst_multidisksrc_close_file (GstMultiDiskSrc *src)
+{
+ g_return_if_fail (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN));
+
+ /* unmap the file from memory and close the file */
+ munmap (src->map, src->size);
+ close (src->fd);
+
+ /* zero out a lot of our state */
+ src->fd = 0;
+ src->size = 0;
+ src->map = NULL;
+ src->new_seek = FALSE;
+
+ GST_FLAG_UNSET (src, GST_MULTIDISKSRC_OPEN);
+}
+
+static GstElementStateReturn
+gst_multidisksrc_change_state (GstElement *element)
+{
+ g_return_val_if_fail (GST_IS_MULTIDISKSRC (element), GST_STATE_FAILURE);
+
+ if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
+ if (GST_FLAG_IS_SET (element, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file (GST_MULTIDISKSRC (element));
+ }
+
+ if (GST_ELEMENT_CLASS (parent_class)->change_state)
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+ return GST_STATE_SUCCESS;
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.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_MULTIDISKSRC_H__
+#define __GST_MULTIDISKSRC_H__
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+GstElementDetails gst_multidisksrc_details;
+
+#define GST_TYPE_MULTIDISKSRC \
+ (gst_multidisksrc_get_type())
+#define GST_MULTIDISKSRC(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrc))
+#define GST_MULTIDISKSRC_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrcClass))
+#define GST_IS_MULTIDISKSRC(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_MULTIDISKSRC))
+#define GST_IS_MULTIDISKSRC_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIDISKSRC))
+
+typedef enum {
+ GST_MULTIDISKSRC_OPEN = GST_ELEMENT_FLAG_LAST,
+
+ GST_MULTIDISKSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2,
+} GstMultiDiskSrcFlags;
+
+typedef struct _GstMultiDiskSrc GstMultiDiskSrc;
+typedef struct _GstMultiDiskSrcClass GstMultiDiskSrcClass;
+
+struct _GstMultiDiskSrc {
+ GstElement element;
+ /* pads */
+ GstPad *srcpad;
+
+ /* current file details */
+ gchar *currentfilename;
+ GSList *listptr;
+
+ /* mapping parameters */
+ gint fd;
+ gulong size; /* how long is the file? */
+ guchar *map; /* where the file is mapped to */
+
+ gboolean new_seek;
+};
+
+struct _GstMultiDiskSrcClass {
+ GstElementClass parent_class;
+
+ void (*new_file) (GstMultiDiskSrc *multidisksrc, gchar *newfilename);
+};
+
+GtkType gst_multidisksrc_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GST_MULTIDISKSRC_H__ */
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.c:
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+//#define GST_DEBUG_ENABLED
+
+#include "gstmultidisksrc.h"
+
+GstElementDetails gst_multidisksrc_details = {
+ "Multi Disk Source",
+ "Source/File",
+ "Read from multiple files in order",
+ VERSION,
+ "Dominic Ludlam <dom@openfx.org>",
+ "(C) 2001",
+};
+
+/* DiskSrc signals and args */
+enum {
+ NEW_FILE,
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_LOCATIONS,
+};
+
+static void gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass);
+static void gst_multidisksrc_init (GstMultiDiskSrc *disksrc);
+
+static void gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id);
+static void gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id);
+
+static GstBuffer * gst_multidisksrc_get (GstPad *pad);
+//static GstBuffer * gst_multidisksrc_get_region (GstPad *pad,GstRegionType type,guint64 offset,guint64 len);
+
+static GstElementStateReturn gst_multidisksrc_change_state (GstElement *element);
+
+static gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad);
+static void gst_multidisksrc_close_file (GstMultiDiskSrc *src);
+
+static GstElementClass *parent_class = NULL;
+static guint gst_multidisksrc_signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+gst_multidisksrc_get_type(void)
+{
+ static GtkType multidisksrc_type = 0;
+
+ if (!multidisksrc_type) {
+ static const GtkTypeInfo multidisksrc_info = {
+ "GstMultiDiskSrc",
+ sizeof(GstMultiDiskSrc),
+ sizeof(GstMultiDiskSrcClass),
+ (GtkClassInitFunc)gst_multidisksrc_class_init,
+ (GtkObjectInitFunc)gst_multidisksrc_init,
+ (GtkArgSetFunc)gst_multidisksrc_set_arg,
+ (GtkArgGetFunc)gst_multidisksrc_get_arg,
+ (GtkClassInitFunc)NULL,
+ };
+ multidisksrc_type = gtk_type_unique (GST_TYPE_ELEMENT, &multidisksrc_info);
+ }
+ return multidisksrc_type;
+}
+
+static void
+gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass)
+{
+ GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
+
+ gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = gtk_type_class (GST_TYPE_ELEMENT);
+
+ gst_multidisksrc_signals[NEW_FILE] =
+ gtk_signal_new ("new_file", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstMultiDiskSrcClass, new_file),
+ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
+ GTK_TYPE_POINTER);
+ gtk_object_class_add_signals (gtkobject_class, gst_multidisksrc_signals, LAST_SIGNAL);
+
+ gtk_object_add_arg_type ("GstMultiDiskSrc::locations", GTK_TYPE_POINTER,
+ GTK_ARG_READWRITE, ARG_LOCATIONS);
+
+ gtkobject_class->set_arg = gst_multidisksrc_set_arg;
+ gtkobject_class->get_arg = gst_multidisksrc_get_arg;
+
+ gstelement_class->change_state = gst_multidisksrc_change_state;
+}
+
+static void
+gst_multidisksrc_init (GstMultiDiskSrc *multidisksrc)
+{
+// GST_FLAG_SET (disksrc, GST_SRC_);
+
+ multidisksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_get_function (multidisksrc->srcpad,gst_multidisksrc_get);
+// gst_pad_set_getregion_function (multidisksrc->srcpad,gst_multidisksrc_get_region);
+ gst_element_add_pad (GST_ELEMENT (multidisksrc), multidisksrc->srcpad);
+
+ multidisksrc->listptr = NULL;
+ multidisksrc->currentfilename = NULL;
+ multidisksrc->fd = 0;
+ multidisksrc->size = 0;
+ multidisksrc->map = NULL;
+ multidisksrc->new_seek = FALSE;
+}
+
+static void
+gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch(id) {
+ case ARG_LOCATIONS:
+ /* the element must be stopped in order to do this */
+ g_return_if_fail (GST_STATE (src) < GST_STATE_PLAYING);
+
+ /* clear the filename if we get a NULL */
+ if (GTK_VALUE_POINTER (*arg) == NULL) {
+ gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
+ src->listptr = NULL;
+ /* otherwise set the new filenames */
+ } else {
+ src->listptr = GTK_VALUE_POINTER(*arg);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch (id) {
+ case ARG_LOCATIONS:
+ GTK_VALUE_POINTER (*arg) = src->listptr;
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/**
+ * gst_disksrc_get:
+ * @pad: #GstPad to push a buffer from
+ *
+ * Push a new buffer from the disksrc at the current offset.
+ */
+static GstBuffer *
+gst_multidisksrc_get (GstPad *pad)
+{
+ GstMultiDiskSrc *src;
+ GstBuffer *buf;
+ GSList *list;
+
+ g_return_val_if_fail (pad != NULL, NULL);
+ src = GST_MULTIDISKSRC (gst_pad_get_parent (pad));
+
+ if (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file(src);
+
+ if (!src->listptr) {
+ gst_pad_set_eos(pad);
+ return FALSE;
+ }
+
+ list = src->listptr;
+ src->currentfilename = (gchar *) list->data;
+ src->listptr = src->listptr->next;
+
+ if (!gst_multidisksrc_open_file(src, pad))
+ return NULL;
+
+ // emitted after the open, as the user may free the list and string from here
+ gtk_signal_emit(GTK_OBJECT(src), gst_multidisksrc_signals[NEW_FILE], list);
+
+ /* create the buffer */
+ // FIXME: should eventually use a bufferpool for this
+ buf = gst_buffer_new ();
+
+ g_return_val_if_fail (buf != NULL, NULL);
+
+ /* simply set the buffer to point to the correct region of the file */
+ GST_BUFFER_DATA (buf) = src->map;
+ GST_BUFFER_OFFSET (buf) = 0;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
+
+ if (src->new_seek) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLUSH);
+ src->new_seek = FALSE;
+ }
+
+ /* we're done, return the buffer */
+ return buf;
+}
+
+/* open the file and mmap it, necessary to go to READY state */
+static
+gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad)
+{
+ g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN), FALSE);
+
+ /* open the file */
+ src->fd = open ((const char *) src->currentfilename, O_RDONLY);
+
+ if (src->fd < 0) {
+ perror ("open");
+ gst_element_error (GST_ELEMENT (src), g_strconcat("opening file \"", src->currentfilename, "\"", NULL));
+ return FALSE;
+ } else {
+ /* find the file length */
+ src->size = lseek (src->fd, 0, SEEK_END);
+ lseek (src->fd, 0, SEEK_SET);
+ /* map the file into memory */
+ src->map = mmap (NULL, src->size, PROT_READ, MAP_SHARED, src->fd, 0);
+ madvise (src->map,src->size, 2);
+ /* collapse state if that failed */
+ if (src->map == NULL) {
+ close (src->fd);
+ gst_element_error (GST_ELEMENT (src),"mmapping file");
+ return FALSE;
+ }
+ GST_FLAG_SET (src, GST_MULTIDISKSRC_OPEN);
+ src->new_seek = TRUE;
+ }
+ return TRUE;
+}
+
+/* unmap and close the file */
+static void
+gst_multidisksrc_close_file (GstMultiDiskSrc *src)
+{
+ g_return_if_fail (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN));
+
+ /* unmap the file from memory and close the file */
+ munmap (src->map, src->size);
+ close (src->fd);
+
+ /* zero out a lot of our state */
+ src->fd = 0;
+ src->size = 0;
+ src->map = NULL;
+ src->new_seek = FALSE;
+
+ GST_FLAG_UNSET (src, GST_MULTIDISKSRC_OPEN);
+}
+
+static GstElementStateReturn
+gst_multidisksrc_change_state (GstElement *element)
+{
+ g_return_val_if_fail (GST_IS_MULTIDISKSRC (element), GST_STATE_FAILURE);
+
+ if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
+ if (GST_FLAG_IS_SET (element, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file (GST_MULTIDISKSRC (element));
+ }
+
+ if (GST_ELEMENT_CLASS (parent_class)->change_state)
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+ return GST_STATE_SUCCESS;
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.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_MULTIDISKSRC_H__
+#define __GST_MULTIDISKSRC_H__
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+GstElementDetails gst_multidisksrc_details;
+
+#define GST_TYPE_MULTIDISKSRC \
+ (gst_multidisksrc_get_type())
+#define GST_MULTIDISKSRC(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrc))
+#define GST_MULTIDISKSRC_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrcClass))
+#define GST_IS_MULTIDISKSRC(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_MULTIDISKSRC))
+#define GST_IS_MULTIDISKSRC_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIDISKSRC))
+
+typedef enum {
+ GST_MULTIDISKSRC_OPEN = GST_ELEMENT_FLAG_LAST,
+
+ GST_MULTIDISKSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2,
+} GstMultiDiskSrcFlags;
+
+typedef struct _GstMultiDiskSrc GstMultiDiskSrc;
+typedef struct _GstMultiDiskSrcClass GstMultiDiskSrcClass;
+
+struct _GstMultiDiskSrc {
+ GstElement element;
+ /* pads */
+ GstPad *srcpad;
+
+ /* current file details */
+ gchar *currentfilename;
+ GSList *listptr;
+
+ /* mapping parameters */
+ gint fd;
+ gulong size; /* how long is the file? */
+ guchar *map; /* where the file is mapped to */
+
+ gboolean new_seek;
+};
+
+struct _GstMultiDiskSrcClass {
+ GstElementClass parent_class;
+
+ void (*new_file) (GstMultiDiskSrc *multidisksrc, gchar *newfilename);
+};
+
+GtkType gst_multidisksrc_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GST_MULTIDISKSRC_H__ */
* Boston, MA 02111-1307, USA.
*/
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/soundcard.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
src->volume = 1.0;
gst_sinesrc_update_vol_scale(src);
- src->format = AFMT_S16_LE;
+ src->format = 16;
src->samplerate = 44100;
src->freq = 100.0;
+ src->newcaps = FALSE;
src->table_pos = 0.0;
src->table_size = 1024;
src->seq = 0;
- src->sentmeta = FALSE;
}
static GstBuffer *
)* src->vol_scale;
}
- if (!src->sentmeta) {
- MetaAudioRaw *newmeta = g_new(MetaAudioRaw,1);
- memcpy(newmeta,&src->meta,sizeof(MetaAudioRaw));
- gst_buffer_add_meta(buf,GST_META(newmeta));
- src->sentmeta = TRUE;
+ if (src->newcaps) {
+ src->newcaps = FALSE;
}
//g_print(">");
table[i] = (gfloat)sin(i * pi2scaled);
}
- g_free(src->table_data);
+ g_free(src->table_data);
src->table_data = table;
}
}
void gst_sinesrc_sync_parms(GstSineSrc *src) {
- src->meta.format = src->format;
- src->meta.channels = 1;
- src->meta.frequency = src->samplerate;
- src->sentmeta = FALSE;
+ src->newcaps = TRUE;
}
#include <config.h>
#include <gst/gst.h>
-#include <gst/meta/audioraw.h>
-
#ifdef __cplusplus
extern "C" {
gint buffer_size;
gulong seq;
- MetaAudioRaw meta;
- gboolean sentmeta;
+ gboolean newcaps;
+
};
struct _GstSineSrcClass {
caps->properties = NULL;
caps->next = NULL;
caps->refcount = 1;
+ caps->lock = g_mutex_new ();
return caps;
}
void
gst_caps_destroy (GstCaps *caps)
{
- g_return_if_fail (caps != NULL);
+ GstCaps *next;
- if (caps->next)
- gst_caps_unref (caps->next);
+ g_return_if_fail (caps != NULL);
+ GST_CAPS_LOCK (caps);
+ next = caps->next;
g_free (caps->name);
g_free (caps);
+ GST_CAPS_UNLOCK (caps);
+
+ if (next)
+ gst_caps_unref (next);
}
/**
void
gst_caps_unref (GstCaps *caps)
{
+ gboolean zero;
+ GstCaps *next;
+
g_return_if_fail (caps != NULL);
+ GST_CAPS_LOCK (caps);
caps->refcount--;
+ zero = (caps->refcount == 0);
+ next = caps->next;
+ GST_CAPS_UNLOCK (caps);
- if (caps->next)
- gst_caps_unref (caps->next);
+ if (next)
+ gst_caps_unref (next);
- if (caps->refcount == 0)
+ if (zero)
gst_caps_destroy (caps);
}
{
g_return_if_fail (caps != NULL);
+ GST_CAPS_LOCK (caps);
caps->refcount++;
+ GST_CAPS_UNLOCK (caps);
}
/**
g_return_val_if_fail (caps != NULL, NULL);
+ GST_CAPS_LOCK (caps);
new = gst_caps_new_with_props (
caps->name,
(gst_type_find_by_id (caps->id))->mime,
gst_props_copy (caps->properties));
+ GST_CAPS_UNLOCK (caps);
return new;
}
GstCaps*
gst_caps_copy_on_write (GstCaps *caps)
{
- GstCaps *new = caps;;
+ GstCaps *new = caps;
+ gboolean needcopy;
g_return_val_if_fail (caps != NULL, NULL);
- if (caps->refcount > 1) {
+ GST_CAPS_LOCK (caps);
+ needcopy = (caps->refcount > 1);
+ GST_CAPS_UNLOCK (caps);
+
+ if (needcopy) {
new = gst_caps_copy (caps);
gst_caps_unref (caps);
}
g_mutex_unlock (_gst_caps_chunk_lock);
caps->refcount = 1;
+ caps->lock = g_mutex_new ();
while (subfield) {
if (!strcmp (subfield->name, "name")) {
typedef GstCapsFactoryEntry GstCapsFactory[];
#endif
+#define GST_CAPS(caps) \
+ ((GstCaps *)(caps))
+
+#define GST_CAPS_LOCK(caps) (g_mutex_lock(GST_CAPS(caps)->lock))
+#define GST_CAPS_TRYLOCK(caps) (g_mutex_trylock(GST_CAPS(caps)->lock))
+#define GST_CAPS_UNLOCK(caps) (g_mutex_unlock(GST_CAPS(caps)->lock))
+
struct _GstCaps {
gchar *name; /* the name of this caps */
guint16 id; /* type id (major type) */
- guint refcount;
+ guint refcount;
+ GMutex *lock; /* global lock for this capability */
GstProps *properties; /* properties for this capability */
2, // GST_PROPS_INT_RANGE_ID_NUM,
1, // GST_PROPS_FOURCC_ID_NUM,
1, // GST_PROPS_BOOL_ID_NUM,
+ 1, // GST_PROPS_STRING_ID_NUM,
};
void
entry->propstype = GST_PROPS_BOOL_ID_NUM;
entry->data.bool_data = GPOINTER_TO_INT (factory[i++]);
break;
+ case GST_PROPS_STRING_ID_NUM:
+ entry->propstype = GST_PROPS_STRING_ID_NUM;
+ entry->data.string_data.string = g_strdup (factory[i++]);
+ break;
default:
g_warning ("gstprops: unknown props id found\n");
g_mutex_lock (_gst_props_entries_chunk_lock);
value = va_arg (var_args, GstPropsFactoryEntry);
thisentry->data.bool_data = GPOINTER_TO_INT (value);
break;
+ case GST_PROPS_STRING_ID_NUM:
+ thisentry->propstype = GST_PROPS_STRING_ID_NUM;
+ value = va_arg (var_args, GstPropsFactoryEntry);
+ thisentry->data.string_data.string = g_strdup (value);
+ break;
default:
g_print("gstprops: type not allowed\n");
break;
}
/**
+ * gst_props_get_string:
+ * @props: the props to get the fourcc value from
+ * @name: the name of the props entry to get.
+ *
+ * Get the named entry as a string value.
+ *
+ * Returns: the string value of the named entry, NULL if not found.
+ */
+const gchar*
+gst_props_get_string (GstProps *props, const gchar *name)
+{
+ GList *lentry;
+ GQuark quark;
+
+ quark = g_quark_from_string (name);
+
+ lentry = g_list_find_custom (props->properties, GINT_TO_POINTER (quark), props_find_func);
+
+ if (lentry) {
+ GstPropsEntry *thisentry;
+
+ thisentry = (GstPropsEntry *)lentry->data;
+
+ return thisentry->data.string_data.string;
+ }
+
+ return NULL;
+}
+
+/**
* gst_props_merge:
* @props: the property to merge into
* @tomerge: the property to merge
default:
return FALSE;
}
+ case GST_PROPS_STRING_ID_NUM:
+ switch (entry2->propstype) {
+ // t <---> t
+ case GST_PROPS_STRING_ID_NUM:
+ return (!strcmp (entry2->data.string_data.string, entry1->data.string_data.string));
+ case GST_PROPS_LIST_ID_NUM:
+ return gst_props_entry_check_list_compatibility (entry1, entry2);
+ default:
+ return FALSE;
+ }
default:
break;
}
xmlNewProp (subtree, "name", g_quark_to_string (entry->propid));
xmlNewProp (subtree, "value", (entry->data.bool_data ? "true" : "false"));
break;
+ case GST_PROPS_STRING_ID_NUM:
+ subtree = xmlNewChild (parent, NULL, "string", NULL);
+ xmlNewProp (subtree, "name", g_quark_to_string (entry->propid));
+ xmlNewProp (subtree, "value", entry->data.string_data.string);
+ break;
default:
break;
}
sscanf (prop, "%08x", &entry->data.fourcc_data);
g_free (prop);
}
+ else if (!strcmp(field->name, "string")) {
+ entry->propstype = GST_PROPS_STRING_ID_NUM;
+ prop = xmlGetProp(field, "name");
+ entry->propid = g_quark_from_string (prop);
+ g_free (prop);
+ entry->data.string_data.string = xmlGetProp (field, "value");
+ }
else {
g_mutex_lock (_gst_props_entries_chunk_lock);
g_mem_chunk_free (_gst_props_entries_chunk, entry);
GST_PROPS_INT_RANGE_ID_NUM,
GST_PROPS_FOURCC_ID_NUM,
GST_PROPS_BOOL_ID_NUM,
+ GST_PROPS_STRING_ID_NUM,
GST_PROPS_LAST_ID_NUM = GST_PROPS_END_ID_NUM + 16,
} GstPropsId;
#define GST_PROPS_INT_RANGE_ID GINT_TO_POINTER(GST_PROPS_INT_RANGE_ID_NUM)
#define GST_PROPS_FOURCC_ID GINT_TO_POINTER(GST_PROPS_FOURCC_ID_NUM)
#define GST_PROPS_BOOL_ID GINT_TO_POINTER(GST_PROPS_BOOL_ID_NUM)
+#define GST_PROPS_STRING_ID GINT_TO_POINTER(GST_PROPS_STRING_ID_NUM)
#define GST_PROPS_LAST_ID GINT_TO_POINTER(GST_PROPS_LAST_ID_NUM)
#define GST_PROPS_LIST(a...) GST_PROPS_LIST_ID,##a,NULL
#define GST_PROPS_FOURCC(a,b,c,d) GST_PROPS_FOURCC_ID,(GINT_TO_POINTER((a)|(b)<<8|(c)<<16|(d)<<24))
#define GST_PROPS_FOURCC_INT(a) GST_PROPS_FOURCC_ID,(GINT_TO_POINTER(a))
#define GST_PROPS_BOOLEAN(a) GST_PROPS_BOOL_ID,(GINT_TO_POINTER(a))
+#define GST_PROPS_STRING(a) GST_PROPS_STRING_ID,(a)
struct _GstProps {
gint refcount;
+ GMutex *lock;
GList *properties; /* real properties for this property */
};
gint gst_props_get_int (GstProps *props, const gchar *name);
gulong gst_props_get_fourcc_int (GstProps *props, const gchar *name);
gboolean gst_props_get_boolean (GstProps *props, const gchar *name);
+const gchar* gst_props_get_string (GstProps *props, const gchar *name);
xmlNodePtr gst_props_save_thyself (GstProps *props, xmlNodePtr parent);
GstProps* gst_props_load_thyself (xmlNodePtr parent);
GList *entries;
} list_data;
struct {
+ gchar *string;
+ } string_data;
+ struct {
gint min;
gint max;
} int_range_data;
metaincludedir = $(includedir)/gst/meta
metainclude_HEADERS = \
- audioraw.h \
videoraw.h
+++ /dev/null
-/* Gnome-Streamer
- * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
- *
- * 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_META_AUDIORAW_H__
-#define __GST_META_AUDIORAW_H__
-
-#include <gst/gstmeta.h>
-#include <sys/soundcard.h>
-
-typedef struct _MetaAudioRaw MetaAudioRaw;
-
-struct _MetaAudioRaw {
- GstMeta meta;
-
- /* formatting information */
- gint format;
- gint channels;
- gint frequency;
- gint bps;
-};
-
-#endif /* __GST_META_AUDIORAW_H__ */
-
priv->bin = gst_bin_new ("main_bin");
g_assert (priv->bin != NULL);
- priv->audio_element = gst_elementfactory_make ("audiosink", "play_audio");
+ priv->audio_element = gst_elementfactory_make ("osssink", "play_audio");
g_return_if_fail (priv->audio_element != NULL);
gtk_signal_connect (GTK_OBJECT (priv->audio_element), "handoff",
GTK_SIGNAL_FUNC (gst_play_audio_handoff), play);
gstfakesink.c \
gstdisksrc.c \
gstfdsrc.c \
- gstaudiosink.c \
- gstaudiosrc.c \
gstfdsink.c \
+ gstmultidisksrc.c \
gstpipefilter.c \
gsttee.c \
gstsinesrc.c \
gstfakesink.h \
gstdisksrc.h \
gstfdsrc.h \
+ gstmultidisksrc.h \
gsthttpsrc.h \
- gstaudiosink.h \
- gstaudiosrc.h \
gstfdsink.h \
gstpipefilter.h \
gsttee.h \
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosink.c:
- *
- * 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.
- */
-
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <fcntl.h>
-#include <sys/soundcard.h>
-#include <unistd.h>
-#include <errno.h>
-
-//#define DEBUG_ENABLED
-
-#include <gstaudiosink.h>
-#include <gst/meta/audioraw.h>
-
-
-GstElementDetails gst_audiosink_details = {
- "Audio Sink (OSS)",
- "Sink/Audio",
- "Output to a sound card via OSS",
- VERSION,
- "Erik Walthinsen <omega@cse.ogi.edu>",
- "(C) 1999",
-};
-
-static void gst_audiosink_class_init (GstAudioSinkClass *klass);
-static void gst_audiosink_init (GstAudioSink *audiosink);
-
-static gboolean gst_audiosink_open_audio (GstAudioSink *sink);
-static void gst_audiosink_close_audio (GstAudioSink *sink);
-static void gst_audiosink_sync_parms (GstAudioSink *audiosink);
-static GstElementStateReturn gst_audiosink_change_state (GstElement *element);
-static GstPadNegotiateReturn gst_audiosink_negotiate (GstPad *pad, GstCaps **caps, gint counter);
-
-static void gst_audiosink_set_arg (GtkObject *object, GtkArg *arg, guint id);
-static void gst_audiosink_get_arg (GtkObject *object, GtkArg *arg, guint id);
-
-static void gst_audiosink_chain (GstPad *pad,GstBuffer *buf);
-
-/* AudioSink signals and args */
-enum {
- SIGNAL_HANDOFF,
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_MUTE,
- ARG_FORMAT,
- ARG_CHANNELS,
- ARG_FREQUENCY,
- /* FILL ME */
-};
-
-static GstPadFactory audiosink_sink_factory = {
- "sink",
- GST_PAD_FACTORY_SINK,
- GST_PAD_FACTORY_ALWAYS,
- GST_PAD_FACTORY_CAPS (
- "audiosink_sink",
- "audio/raw",
- "format", GST_PROPS_INT (AFMT_S16_LE),
- "depth", GST_PROPS_LIST (
- GST_PROPS_INT (8),
- GST_PROPS_INT (16)
- ),
- "rate", GST_PROPS_INT_RANGE (8000, 48000),
- "channels", GST_PROPS_INT_RANGE (1, 2)
- ),
- NULL
-};
-
-#define GST_TYPE_AUDIOSINK_FORMATS (gst_audiosink_formats_get_type())
-
-static GtkType
-gst_audiosink_formats_get_type(void) {
- static GtkType audiosink_formats_type = 0;
- static GtkEnumValue audiosink_formats[] = {
- {8, "8", "8 Bits"},
- {16, "16", "16 Bits"},
- {0, NULL, NULL},
- };
- if (!audiosink_formats_type) {
- audiosink_formats_type = gtk_type_register_enum("GstAudiosinkFormats", audiosink_formats);
- }
- return audiosink_formats_type;
-}
-
-#define GST_TYPE_AUDIOSINK_CHANNELS (gst_audiosink_channels_get_type())
-
-static GtkType
-gst_audiosink_channels_get_type(void) {
- static GtkType audiosink_channels_type = 0;
- static GtkEnumValue audiosink_channels[] = {
- {1, "1", "Mono"},
- {2, "2", "Stereo"},
- {0, NULL, NULL},
- };
- if (!audiosink_channels_type) {
- audiosink_channels_type = gtk_type_register_enum("GstAudiosinkChannels", audiosink_channels);
- }
- return audiosink_channels_type;
-}
-
-
-static GstElementClass *parent_class = NULL;
-static guint gst_audiosink_signals[LAST_SIGNAL] = { 0 };
-
-static GstPadTemplate *gst_audiosink_sink_template;
-
-GtkType
-gst_audiosink_get_type (void)
-{
- static GtkType audiosink_type = 0;
-
- if (!audiosink_type) {
- static const GtkTypeInfo audiosink_info = {
- "GstAudioSink",
- sizeof(GstAudioSink),
- sizeof(GstAudioSinkClass),
- (GtkClassInitFunc)gst_audiosink_class_init,
- (GtkObjectInitFunc)gst_audiosink_init,
- (GtkArgSetFunc)NULL,
- (GtkArgGetFunc)NULL,
- (GtkClassInitFunc)NULL,
- };
- audiosink_type = gtk_type_unique (GST_TYPE_ELEMENT, &audiosink_info);
- }
-
- return audiosink_type;
-}
-
-static void
-gst_audiosink_class_init (GstAudioSinkClass *klass)
-{
- GtkObjectClass *gtkobject_class;
- GstElementClass *gstelement_class;
-
- gtkobject_class = (GtkObjectClass*)klass;
- gstelement_class = (GstElementClass*)klass;
-
- parent_class = gtk_type_class(GST_TYPE_ELEMENT);
-
- gtk_object_add_arg_type ("GstAudioSink::mute", GTK_TYPE_BOOL,
- GTK_ARG_READWRITE, ARG_MUTE);
- gtk_object_add_arg_type ("GstAudioSink::format", GST_TYPE_AUDIOSINK_FORMATS,
- GTK_ARG_READWRITE, ARG_FORMAT);
- gtk_object_add_arg_type ("GstAudioSink::channels", GST_TYPE_AUDIOSINK_CHANNELS,
- GTK_ARG_READWRITE, ARG_CHANNELS);
- gtk_object_add_arg_type ("GstAudioSink::frequency", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_FREQUENCY);
-
- gtkobject_class->set_arg = gst_audiosink_set_arg;
- gtkobject_class->get_arg = gst_audiosink_get_arg;
-
- gst_audiosink_signals[SIGNAL_HANDOFF] =
- gtk_signal_new("handoff",GTK_RUN_LAST,gtkobject_class->type,
- GTK_SIGNAL_OFFSET(GstAudioSinkClass,handoff),
- gtk_marshal_NONE__NONE,GTK_TYPE_NONE,0);
-
- gtk_object_class_add_signals(gtkobject_class,gst_audiosink_signals,
- LAST_SIGNAL);
-
- gstelement_class->change_state = gst_audiosink_change_state;
-}
-
-static void
-gst_audiosink_init (GstAudioSink *audiosink)
-{
- audiosink->sinkpad = gst_pad_new_from_template (gst_audiosink_sink_template, "sink");
- gst_element_add_pad (GST_ELEMENT (audiosink), audiosink->sinkpad);
- gst_pad_set_negotiate_function (audiosink->sinkpad, gst_audiosink_negotiate);
-
- gst_pad_set_chain_function (audiosink->sinkpad, gst_audiosink_chain);
-
- audiosink->fd = -1;
- audiosink->clock = gst_clock_get_system();
- audiosink->format = 16;
- audiosink->channels = 2;
- audiosink->frequency = 44100;
-
- gst_clock_register (audiosink->clock, GST_OBJECT (audiosink));
-
- GST_FLAG_SET (audiosink, GST_ELEMENT_THREAD_SUGGESTED);
-}
-
-static GstPadNegotiateReturn
-gst_audiosink_negotiate (GstPad *pad, GstCaps **caps, gint counter)
-{
- GstAudioSink *audiosink;
-
- g_return_val_if_fail (pad != NULL, GST_PAD_NEGOTIATE_FAIL);
- g_return_val_if_fail (GST_IS_PAD (pad), GST_PAD_NEGOTIATE_FAIL);
-
- audiosink = GST_AUDIOSINK (gst_pad_get_parent (pad));
-
- g_print ("audiosink: negotiate\n");
- // we decide
- if (counter == 0) {
- *caps = NULL;
- return GST_PAD_NEGOTIATE_TRY;
- }
- // have we got caps?
- else if (*caps) {
- if (audiosink->fd == -1) return GST_PAD_NEGOTIATE_FAIL;
-
- audiosink->format = gst_caps_get_int (*caps, "format");
- audiosink->channels = gst_caps_get_int (*caps, "channels");
- audiosink->frequency = gst_caps_get_int (*caps, "rate");
-
- gst_audiosink_sync_parms (audiosink);
-
- // FIXME check if the qound card was really set to these caps,
- // else send out another caps..
-
- return GST_PAD_NEGOTIATE_AGREE;
- }
-
- return GST_PAD_NEGOTIATE_FAIL;
-}
-
-static void
-gst_audiosink_sync_parms (GstAudioSink *audiosink)
-{
- audio_buf_info ospace;
- int frag;
-
- g_return_if_fail (audiosink != NULL);
- g_return_if_fail (GST_IS_AUDIOSINK (audiosink));
-
- if (audiosink->fd == -1) return;
-
- ioctl (audiosink->fd, SNDCTL_DSP_RESET, 0);
-
- ioctl (audiosink->fd, SNDCTL_DSP_SETFMT, &audiosink->format);
- ioctl (audiosink->fd, SNDCTL_DSP_CHANNELS, &audiosink->channels);
- ioctl (audiosink->fd, SNDCTL_DSP_SPEED, &audiosink->frequency);
- ioctl (audiosink->fd, SNDCTL_DSP_GETBLKSIZE, &frag);
-
- ioctl (audiosink->fd, SNDCTL_DSP_GETOSPACE, &ospace);
-
- g_print("audiosink: setting sound card to %dHz %d bit %s (%d bytes buffer, %d fragment)\n",
- audiosink->frequency, audiosink->format,
- (audiosink->channels == 2) ? "stereo" : "mono", ospace.bytes, frag);
-
-}
-
-static void
-gst_audiosink_chain (GstPad *pad, GstBuffer *buf)
-{
- GstAudioSink *audiosink;
- gboolean in_flush;
- audio_buf_info ospace;
-
- g_return_if_fail (pad != NULL);
- g_return_if_fail (GST_IS_PAD (pad));
- g_return_if_fail (buf != NULL);
-
-
- /* this has to be an audio buffer */
-// g_return_if_fail(((GstMeta *)buf->meta)->type !=
-//gst_audiosink_type_audio);
- audiosink = GST_AUDIOSINK (gst_pad_get_parent (pad));
-// g_return_if_fail(GST_FLAG_IS_SET(audiosink,GST_STATE_RUNNING));
-
- if ((in_flush = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLUSH))) {
- GST_DEBUG (0,"audiosink: flush\n");
- ioctl (audiosink->fd, SNDCTL_DSP_RESET, 0);
- }
-
- gtk_signal_emit (GTK_OBJECT (audiosink), gst_audiosink_signals[SIGNAL_HANDOFF],
- audiosink);
-
- if (GST_BUFFER_DATA (buf) != NULL) {
- gst_trace_add_entry(NULL, 0, buf, "audiosink: writing to soundcard");
- //g_print("audiosink: writing to soundcard\n");
- if (audiosink->fd >= 0) {
- if (!audiosink->mute) {
- gst_clock_wait (audiosink->clock, GST_BUFFER_TIMESTAMP (buf), GST_OBJECT (audiosink));
- ioctl (audiosink->fd, SNDCTL_DSP_GETOSPACE, &ospace);
- GST_DEBUG (0,"audiosink: (%d bytes buffer) %d %p %d\n", ospace.bytes,
- audiosink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
- write (audiosink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
- //write(STDOUT_FILENO,GST_BUFFER_DATA(buf),GST_BUFFER_SIZE(buf));
- }
- }
- }
- gst_buffer_unref (buf);
-}
-
-static void
-gst_audiosink_set_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSink *audiosink;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSINK (object));
-
- audiosink = GST_AUDIOSINK (object);
-
- switch(id) {
- case ARG_MUTE:
- audiosink->mute = GTK_VALUE_BOOL (*arg);
- break;
- case ARG_FORMAT:
- audiosink->format = GTK_VALUE_ENUM (*arg);
- gst_audiosink_sync_parms (audiosink);
- break;
- case ARG_CHANNELS:
- audiosink->channels = GTK_VALUE_ENUM (*arg);
- gst_audiosink_sync_parms (audiosink);
- break;
- case ARG_FREQUENCY:
- audiosink->frequency = GTK_VALUE_INT (*arg);
- gst_audiosink_sync_parms (audiosink);
- break;
- default:
- break;
- }
-}
-
-static void
-gst_audiosink_get_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSink *audiosink;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSINK (object));
-
- audiosink = GST_AUDIOSINK (object);
-
- switch(id) {
- case ARG_MUTE:
- GTK_VALUE_BOOL (*arg) = audiosink->mute;
- break;
- case ARG_FORMAT:
- GTK_VALUE_ENUM (*arg) = audiosink->format;
- break;
- case ARG_CHANNELS:
- GTK_VALUE_ENUM (*arg) = audiosink->channels;
- break;
- case ARG_FREQUENCY:
- GTK_VALUE_INT (*arg) = audiosink->frequency;
- break;
- default:
- break;
- }
-}
-
-static gboolean
-gst_audiosink_open_audio (GstAudioSink *sink)
-{
- g_return_val_if_fail (sink->fd == -1, FALSE);
-
- g_print ("audiosink: attempting to open sound device\n");
-
- /* first try to open the sound card */
- sink->fd = open("/dev/dsp", O_WRONLY | O_NONBLOCK);
- if (errno == EBUSY) {
- g_print ("audiosink: unable to open the sound device (in use ?)\n");
- return FALSE;
- }
-
- /* re-open the sound device in blocking mode */
- close(sink->fd);
- sink->fd = open("/dev/dsp", O_WRONLY);
-
- /* if we have it, set the default parameters and go have fun */
- if (sink->fd >= 0) {
- /* set card state */
- ioctl(sink->fd, SNDCTL_DSP_GETCAPS, &sink->caps);
-
- g_print("audiosink: Capabilities\n");
-
- if (sink->caps & DSP_CAP_DUPLEX) g_print("audiosink: Full duplex\n");
- if (sink->caps & DSP_CAP_REALTIME) g_print("audiosink: Realtime\n");
- if (sink->caps & DSP_CAP_BATCH) g_print("audiosink: Batch\n");
- if (sink->caps & DSP_CAP_COPROC) g_print("audiosink: Has coprocessor\n");
- if (sink->caps & DSP_CAP_TRIGGER) g_print("audiosink: Trigger\n");
- if (sink->caps & DSP_CAP_MMAP) g_print("audiosink: Direct access\n");
-
- g_print("audiosink: opened audio with fd=%d\n", sink->fd);
- GST_FLAG_SET (sink, GST_AUDIOSINK_OPEN);
-
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gst_audiosink_close_audio (GstAudioSink *sink)
-{
- if (sink->fd < 0) return;
-
- close(sink->fd);
- sink->fd = -1;
-
- GST_FLAG_UNSET (sink, GST_AUDIOSINK_OPEN);
-
- g_print("audiosink: closed sound device\n");
-}
-
-static GstElementStateReturn
-gst_audiosink_change_state (GstElement *element)
-{
- g_return_val_if_fail (GST_IS_AUDIOSINK (element), FALSE);
-
- /* if going down into NULL state, close the file if it's open */
- if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
- if (GST_FLAG_IS_SET (element, GST_AUDIOSINK_OPEN))
- gst_audiosink_close_audio (GST_AUDIOSINK (element));
- /* otherwise (READY or higher) we need to open the sound card */
- } else {
- if (!GST_FLAG_IS_SET (element, GST_AUDIOSINK_OPEN)) {
- if (!gst_audiosink_open_audio (GST_AUDIOSINK (element))) {
- //return GST_STATE_FAILURE;
- }
- }
- }
-
- if (GST_ELEMENT_CLASS (parent_class)->change_state)
- return GST_ELEMENT_CLASS (parent_class)->change_state (element);
- return GST_STATE_SUCCESS;
-}
-
-gboolean
-gst_audiosink_factory_init (GstElementFactory *factory)
-{
- gst_audiosink_sink_template = gst_padtemplate_new (&audiosink_sink_factory);
- gst_elementfactory_add_padtemplate (factory, gst_audiosink_sink_template);
-
- return TRUE;
-}
-
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosink.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_AUDIOSINK_H__
-#define __GST_AUDIOSINK_H__
-
-
-#include <config.h>
-#include <gst/gst.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-GstElementDetails gst_audiosink_details;
-
-
-#define GST_TYPE_AUDIOSINK \
- (gst_audiosink_get_type())
-#define GST_AUDIOSINK(obj) \
- (GTK_CHECK_CAST((obj),GST_TYPE_AUDIOSINK,GstAudioSink))
-#define GST_AUDIOSINK_CLASS(klass) \
- (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOSINK,GstAudioSinkClass))
-#define GST_IS_AUDIOSINK(obj) \
- (GTK_CHECK_TYPE((obj),GST_TYPE_AUDIOSINK))
-#define GST_IS_AUDIOSINK_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOSINK))
-
-typedef enum {
- GST_AUDIOSINK_OPEN = GST_ELEMENT_FLAG_LAST,
-
- GST_AUDIOSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2,
-} GstAudioSinkFlags;
-
-typedef struct _GstAudioSink GstAudioSink;
-typedef struct _GstAudioSinkClass GstAudioSinkClass;
-
-struct _GstAudioSink {
- GstElement element;
-
- GstPad *sinkpad;
-
- //GstClockTime clocktime;
- GstClock *clock;
- /* soundcard state */
- int fd;
- int caps; /* the capabilities */
- gint format;
- gint channels;
- gint frequency;
- gboolean mute;
-};
-
-struct _GstAudioSinkClass {
- GstElementClass parent_class;
-
- /* signals */
- void (*handoff) (GstElement *element,GstPad *pad);
-};
-
-GtkType gst_audiosink_get_type(void);
-
-gboolean gst_audiosink_factory_init(GstElementFactory *factory);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __GST_AUDIOSINK_H__ */
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosrc.c:
- *
- * 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.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/soundcard.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-
-#include <gstaudiosrc.h>
-
-
-GstElementDetails gst_audiosrc_details = {
- "Audio (OSS) Source",
- "Source/Audio",
- "Read from the sound card",
- VERSION,
- "Erik Walthinsen <omega@cse.ogi.edu>",
- "(C) 1999",
-};
-
-
-/* AudioSrc signals and args */
-enum {
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum {
- ARG_0,
- ARG_BYTESPERREAD,
- ARG_CUROFFSET,
- ARG_FORMAT,
- ARG_CHANNELS,
- ARG_FREQUENCY,
-};
-
-
-static void gst_audiosrc_class_init (GstAudioSrcClass *klass);
-static void gst_audiosrc_init (GstAudioSrc *audiosrc);
-
-static void gst_audiosrc_set_arg (GtkObject *object, GtkArg *arg, guint id);
-static void gst_audiosrc_get_arg (GtkObject *object, GtkArg *arg, guint id);
-static GstElementStateReturn gst_audiosrc_change_state (GstElement *element);
-
-static void gst_audiosrc_close_audio (GstAudioSrc *src);
-static gboolean gst_audiosrc_open_audio (GstAudioSrc *src);
-static void gst_audiosrc_sync_parms (GstAudioSrc *audiosrc);
-
-static GstBuffer * gst_audiosrc_get (GstPad *pad);
-
-static GstElementClass *parent_class = NULL;
-//static guint gst_audiosrc_signals[LAST_SIGNAL] = { 0 };
-
-GtkType
-gst_audiosrc_get_type (void)
-{
- static GtkType audiosrc_type = 0;
-
- if (!audiosrc_type) {
- static const GtkTypeInfo audiosrc_info = {
- "GstAudioSrc",
- sizeof(GstAudioSrc),
- sizeof(GstAudioSrcClass),
- (GtkClassInitFunc)gst_audiosrc_class_init,
- (GtkObjectInitFunc)gst_audiosrc_init,
- (GtkArgSetFunc)gst_audiosrc_set_arg,
- (GtkArgGetFunc)gst_audiosrc_get_arg,
- (GtkClassInitFunc)NULL,
- };
- audiosrc_type = gtk_type_unique (GST_TYPE_ELEMENT, &audiosrc_info);
- }
- return audiosrc_type;
-}
-
-static void
-gst_audiosrc_class_init (GstAudioSrcClass *klass)
-{
- GtkObjectClass *gtkobject_class;
- GstElementClass *gstelement_class;
-
- gtkobject_class = (GtkObjectClass*)klass;
- gstelement_class = (GstElementClass*)klass;
-
- parent_class = gtk_type_class (GST_TYPE_ELEMENT);
-
- gtk_object_add_arg_type ("GstAudioSrc::bytes_per_read", GTK_TYPE_ULONG,
- GTK_ARG_READWRITE, ARG_BYTESPERREAD);
- gtk_object_add_arg_type ("GstAudioSrc::curoffset", GTK_TYPE_ULONG,
- GTK_ARG_READABLE, ARG_CUROFFSET);
- gtk_object_add_arg_type ("GstAudioSrc::format", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_FORMAT);
- gtk_object_add_arg_type ("GstAudioSrc::channels", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_CHANNELS);
- gtk_object_add_arg_type ("GstAudioSrc::frequency", GTK_TYPE_INT,
- GTK_ARG_READWRITE, ARG_FREQUENCY);
-
- gtkobject_class->set_arg = gst_audiosrc_set_arg;
- gtkobject_class->get_arg = gst_audiosrc_get_arg;
-
- gstelement_class->change_state = gst_audiosrc_change_state;
-}
-
-static void
-gst_audiosrc_init (GstAudioSrc *audiosrc)
-{
- audiosrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
- gst_pad_set_get_function(audiosrc->srcpad,gst_audiosrc_get);
- gst_element_add_pad (GST_ELEMENT (audiosrc), audiosrc->srcpad);
-
- audiosrc->fd = -1;
-
-// audiosrc->meta = (MetaAudioRaw *)gst_meta_new();
-// audiosrc->meta->format = AFMT_S16_LE;
-// audiosrc->meta->channels = 2;
-// audiosrc->meta->frequency = 44100;
-// audiosrc->meta->bps = 4;
-
- audiosrc->bytes_per_read = 4096;
- audiosrc->curoffset = 0;
- audiosrc->seq = 0;
-}
-
-static GstBuffer *
-gst_audiosrc_get (GstPad *pad)
-{
- GstAudioSrc *src;
- GstBuffer *buf;
- glong readbytes;
-
- g_return_val_if_fail (pad != NULL, NULL);
- src = GST_AUDIOSRC(gst_pad_get_parent (pad));
-
-// g_print("attempting to read something from soundcard\n");
-
- buf = gst_buffer_new ();
- g_return_val_if_fail (buf, NULL);
-
- GST_BUFFER_DATA (buf) = (gpointer)g_malloc (src->bytes_per_read);
-
- readbytes = read (src->fd,GST_BUFFER_DATA (buf),
- src->bytes_per_read);
-
- if (readbytes == 0) {
- gst_element_signal_eos (GST_ELEMENT (src));
- return NULL;
- }
-
- GST_BUFFER_SIZE (buf) = readbytes;
- GST_BUFFER_OFFSET (buf) = src->curoffset;
-
- src->curoffset += readbytes;
-
-// gst_buffer_add_meta(buf,GST_META(newmeta));
-
-// g_print("pushed buffer from soundcard of %d bytes\n",readbytes);
- return buf;
-}
-
-static void
-gst_audiosrc_set_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSrc *src;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSRC (object));
-
- src = GST_AUDIOSRC (object);
-
- switch (id) {
- case ARG_BYTESPERREAD:
- src->bytes_per_read = GTK_VALUE_INT (*arg);
- break;
- case ARG_FORMAT:
- src->format = GTK_VALUE_INT (*arg);
- break;
- case ARG_CHANNELS:
- src->channels = GTK_VALUE_INT (*arg);
- break;
- case ARG_FREQUENCY:
- src->frequency = GTK_VALUE_INT (*arg);
- break;
- default:
- break;
- }
-}
-
-static void
-gst_audiosrc_get_arg (GtkObject *object, GtkArg *arg, guint id)
-{
- GstAudioSrc *src;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_AUDIOSRC (object));
-
- src = GST_AUDIOSRC (object);
-
- switch (id) {
- case ARG_BYTESPERREAD:
- GTK_VALUE_INT (*arg) = src->bytes_per_read;
- break;
- case ARG_FORMAT:
- GTK_VALUE_INT (*arg) = src->format;
- break;
- case ARG_CHANNELS:
- GTK_VALUE_INT (*arg) = src->channels;
- break;
- case ARG_FREQUENCY:
- GTK_VALUE_INT (*arg) = src->frequency;
- break;
- default:
- arg->type = GTK_TYPE_INVALID;
- break;
- }
-}
-
-static GstElementStateReturn
-gst_audiosrc_change_state (GstElement *element)
-{
- g_return_val_if_fail (GST_IS_AUDIOSRC (element), FALSE);
-
- /* if going down into NULL state, close the file if it's open */
- if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
- if (GST_FLAG_IS_SET (element, GST_AUDIOSRC_OPEN))
- gst_audiosrc_close_audio (GST_AUDIOSRC (element));
- /* otherwise (READY or higher) we need to open the sound card */
- } else {
- if (!GST_FLAG_IS_SET (element, GST_AUDIOSRC_OPEN)) {
- if (!gst_audiosrc_open_audio (GST_AUDIOSRC (element)))
- return GST_STATE_FAILURE;
- }
- }
-
- if (GST_ELEMENT_CLASS (parent_class)->change_state)
- return GST_ELEMENT_CLASS (parent_class)->change_state (element);
-
- return GST_STATE_SUCCESS;
-}
-
-static gboolean
-gst_audiosrc_open_audio (GstAudioSrc *src)
-{
- g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_AUDIOSRC_OPEN), FALSE);
-
- /* first try to open the sound card */
- src->fd = open("/dev/dsp", O_RDONLY);
-
- /* if we have it, set the default parameters and go have fun */
- if (src->fd > 0) {
- int arg = 0x7fff0006;
-
- if (ioctl (src->fd, SNDCTL_DSP_SETFRAGMENT, &arg)) perror("uh");
-
- /* set card state */
- gst_audiosrc_sync_parms (src);
- GST_DEBUG (0,"opened audio\n");
-
- GST_FLAG_SET (src, GST_AUDIOSRC_OPEN);
- return TRUE;
- }
-
- return FALSE;
-}
-
-static void
-gst_audiosrc_close_audio (GstAudioSrc *src)
-{
- g_return_if_fail (GST_FLAG_IS_SET (src, GST_AUDIOSRC_OPEN));
-
- close(src->fd);
- src->fd = -1;
-
- GST_FLAG_UNSET (src, GST_AUDIOSRC_OPEN);
-}
-
-static void
-gst_audiosrc_sync_parms (GstAudioSrc *audiosrc)
-{
- audio_buf_info ospace;
-
- g_return_if_fail (audiosrc != NULL);
- g_return_if_fail (GST_IS_AUDIOSRC (audiosrc));
- g_return_if_fail (audiosrc->fd > 0);
-
- ioctl(audiosrc->fd, SNDCTL_DSP_RESET, 0);
-
- ioctl(audiosrc->fd, SNDCTL_DSP_SETFMT, &audiosrc->format);
- ioctl(audiosrc->fd, SNDCTL_DSP_CHANNELS, &audiosrc->channels);
- ioctl(audiosrc->fd, SNDCTL_DSP_SPEED, &audiosrc->frequency);
-
- ioctl(audiosrc->fd, SNDCTL_DSP_GETOSPACE, &ospace);
-
- g_print("setting sound card to %dKHz %d bit %s (%d bytes buffer)\n",
- audiosrc->frequency,audiosrc->format,
- (audiosrc->channels == 2) ? "stereo" : "mono",ospace.bytes);
-
-// audiosrc->meta.format = audiosrc->format;
-// audiosrc->meta.channels = audiosrc->channels;
-// audiosrc->meta.frequency = audiosrc->frequency;
-// audiosrc->sentmeta = FALSE;
-}
+++ /dev/null
-/* GStreamer
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- * 2000 Wim Taymans <wtay@chello.be>
- *
- * gstaudiosrc.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_AUDIOSRC_H__
-#define __GST_AUDIOSRC_H__
-
-
-#include <config.h>
-#include <gst/gst.h>
-#include <gst/meta/audioraw.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-GstElementDetails gst_audiosrc_details;
-
-
-#define GST_TYPE_AUDIOSRC \
- (gst_audiosrc_get_type())
-#define GST_AUDIOSRC(obj) \
- (GTK_CHECK_CAST((obj),GST_TYPE_AUDIOSRC,GstAudioSrc))
-#define GST_AUDIOSRC_CLASS(klass) \
- (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOSRC,GstAudioSrcClass))
-#define GST_IS_AUDIOSRC(obj) \
- (GTK_CHECK_TYPE((obj),GST_TYPE_AUDIOSRC))
-#define GST_IS_AUDIOSRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOSRC))
-
-typedef enum {
- GST_AUDIOSRC_OPEN = GST_ELEMENT_FLAG_LAST,
-
- GST_AUDIOSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2,
-} GstAudioSrcFlags;
-
-typedef struct _GstAudioSrc GstAudioSrc;
-typedef struct _GstAudioSrcClass GstAudioSrcClass;
-
-struct _GstAudioSrc {
- GstElement element;
-
- /* pads */
- GstPad *srcpad;
-
- /* sound card */
- gint fd;
-
- /* audio parameters */
- gint format;
- gint channels;
- gint frequency;
-
- /* blocking */
- gulong curoffset;
- gulong bytes_per_read;
-
- gulong seq;
-
- MetaAudioRaw *meta;
-};
-
-struct _GstAudioSrcClass {
- GstElementClass parent_class;
-};
-
-GtkType gst_audiosrc_get_type(void);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-
-#endif /* __GST_AUDIOSRC_H__ */
#include <gst/gst.h>
-#include "gstaudiosink.h"
-#include "gstaudiosrc.h"
#include "gstdisksrc.h"
#include "gstidentity.h"
#include "gstfakesink.h"
#include "gstfakesrc.h"
#include "gstfdsink.h"
#include "gstfdsrc.h"
+#include "gstmultidisksrc.h"
#include "gstpipefilter.h"
#include "gstsinesrc.h"
#include "gsttee.h"
static struct _elements_entry _elements[] = {
{ "fakesrc", gst_fakesrc_get_type, &gst_fakesrc_details, NULL },
{ "fakesink", gst_fakesink_get_type, &gst_fakesink_details, NULL },
- { "audiosink", gst_audiosink_get_type, &gst_audiosink_details, gst_audiosink_factory_init },
- { "audiosrc", gst_audiosrc_get_type, &gst_audiosrc_details, NULL },
{ "disksrc", gst_disksrc_get_type, &gst_disksrc_details, NULL },
{ "identity", gst_identity_get_type, &gst_identity_details, NULL },
{ "fdsink", gst_fdsink_get_type, &gst_fdsink_details, NULL },
{ "fdsrc", gst_fdsrc_get_type, &gst_fdsrc_details, NULL },
+ { "multidisksrc", gst_multidisksrc_get_type, &gst_multidisksrc_details, NULL },
{ "pipefilter", gst_pipefilter_get_type, &gst_pipefilter_details, NULL },
{ "sinesrc", gst_sinesrc_get_type, &gst_sinesrc_details, NULL },
{ "tee", gst_tee_get_type, &gst_tee_details, gst_tee_factory_init },
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.c:
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+//#define GST_DEBUG_ENABLED
+
+#include "gstmultidisksrc.h"
+
+GstElementDetails gst_multidisksrc_details = {
+ "Multi Disk Source",
+ "Source/File",
+ "Read from multiple files in order",
+ VERSION,
+ "Dominic Ludlam <dom@openfx.org>",
+ "(C) 2001",
+};
+
+/* DiskSrc signals and args */
+enum {
+ NEW_FILE,
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_LOCATIONS,
+};
+
+static void gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass);
+static void gst_multidisksrc_init (GstMultiDiskSrc *disksrc);
+
+static void gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id);
+static void gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id);
+
+static GstBuffer * gst_multidisksrc_get (GstPad *pad);
+//static GstBuffer * gst_multidisksrc_get_region (GstPad *pad,GstRegionType type,guint64 offset,guint64 len);
+
+static GstElementStateReturn gst_multidisksrc_change_state (GstElement *element);
+
+static gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad);
+static void gst_multidisksrc_close_file (GstMultiDiskSrc *src);
+
+static GstElementClass *parent_class = NULL;
+static guint gst_multidisksrc_signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+gst_multidisksrc_get_type(void)
+{
+ static GtkType multidisksrc_type = 0;
+
+ if (!multidisksrc_type) {
+ static const GtkTypeInfo multidisksrc_info = {
+ "GstMultiDiskSrc",
+ sizeof(GstMultiDiskSrc),
+ sizeof(GstMultiDiskSrcClass),
+ (GtkClassInitFunc)gst_multidisksrc_class_init,
+ (GtkObjectInitFunc)gst_multidisksrc_init,
+ (GtkArgSetFunc)gst_multidisksrc_set_arg,
+ (GtkArgGetFunc)gst_multidisksrc_get_arg,
+ (GtkClassInitFunc)NULL,
+ };
+ multidisksrc_type = gtk_type_unique (GST_TYPE_ELEMENT, &multidisksrc_info);
+ }
+ return multidisksrc_type;
+}
+
+static void
+gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass)
+{
+ GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
+
+ gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = gtk_type_class (GST_TYPE_ELEMENT);
+
+ gst_multidisksrc_signals[NEW_FILE] =
+ gtk_signal_new ("new_file", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstMultiDiskSrcClass, new_file),
+ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
+ GTK_TYPE_POINTER);
+ gtk_object_class_add_signals (gtkobject_class, gst_multidisksrc_signals, LAST_SIGNAL);
+
+ gtk_object_add_arg_type ("GstMultiDiskSrc::locations", GTK_TYPE_POINTER,
+ GTK_ARG_READWRITE, ARG_LOCATIONS);
+
+ gtkobject_class->set_arg = gst_multidisksrc_set_arg;
+ gtkobject_class->get_arg = gst_multidisksrc_get_arg;
+
+ gstelement_class->change_state = gst_multidisksrc_change_state;
+}
+
+static void
+gst_multidisksrc_init (GstMultiDiskSrc *multidisksrc)
+{
+// GST_FLAG_SET (disksrc, GST_SRC_);
+
+ multidisksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_get_function (multidisksrc->srcpad,gst_multidisksrc_get);
+// gst_pad_set_getregion_function (multidisksrc->srcpad,gst_multidisksrc_get_region);
+ gst_element_add_pad (GST_ELEMENT (multidisksrc), multidisksrc->srcpad);
+
+ multidisksrc->listptr = NULL;
+ multidisksrc->currentfilename = NULL;
+ multidisksrc->fd = 0;
+ multidisksrc->size = 0;
+ multidisksrc->map = NULL;
+ multidisksrc->new_seek = FALSE;
+}
+
+static void
+gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch(id) {
+ case ARG_LOCATIONS:
+ /* the element must be stopped in order to do this */
+ g_return_if_fail (GST_STATE (src) < GST_STATE_PLAYING);
+
+ /* clear the filename if we get a NULL */
+ if (GTK_VALUE_POINTER (*arg) == NULL) {
+ gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
+ src->listptr = NULL;
+ /* otherwise set the new filenames */
+ } else {
+ src->listptr = GTK_VALUE_POINTER(*arg);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch (id) {
+ case ARG_LOCATIONS:
+ GTK_VALUE_POINTER (*arg) = src->listptr;
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/**
+ * gst_disksrc_get:
+ * @pad: #GstPad to push a buffer from
+ *
+ * Push a new buffer from the disksrc at the current offset.
+ */
+static GstBuffer *
+gst_multidisksrc_get (GstPad *pad)
+{
+ GstMultiDiskSrc *src;
+ GstBuffer *buf;
+ GSList *list;
+
+ g_return_val_if_fail (pad != NULL, NULL);
+ src = GST_MULTIDISKSRC (gst_pad_get_parent (pad));
+
+ if (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file(src);
+
+ if (!src->listptr) {
+ gst_pad_set_eos(pad);
+ return FALSE;
+ }
+
+ list = src->listptr;
+ src->currentfilename = (gchar *) list->data;
+ src->listptr = src->listptr->next;
+
+ if (!gst_multidisksrc_open_file(src, pad))
+ return NULL;
+
+ // emitted after the open, as the user may free the list and string from here
+ gtk_signal_emit(GTK_OBJECT(src), gst_multidisksrc_signals[NEW_FILE], list);
+
+ /* create the buffer */
+ // FIXME: should eventually use a bufferpool for this
+ buf = gst_buffer_new ();
+
+ g_return_val_if_fail (buf != NULL, NULL);
+
+ /* simply set the buffer to point to the correct region of the file */
+ GST_BUFFER_DATA (buf) = src->map;
+ GST_BUFFER_OFFSET (buf) = 0;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
+
+ if (src->new_seek) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLUSH);
+ src->new_seek = FALSE;
+ }
+
+ /* we're done, return the buffer */
+ return buf;
+}
+
+/* open the file and mmap it, necessary to go to READY state */
+static
+gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad)
+{
+ g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN), FALSE);
+
+ /* open the file */
+ src->fd = open ((const char *) src->currentfilename, O_RDONLY);
+
+ if (src->fd < 0) {
+ perror ("open");
+ gst_element_error (GST_ELEMENT (src), g_strconcat("opening file \"", src->currentfilename, "\"", NULL));
+ return FALSE;
+ } else {
+ /* find the file length */
+ src->size = lseek (src->fd, 0, SEEK_END);
+ lseek (src->fd, 0, SEEK_SET);
+ /* map the file into memory */
+ src->map = mmap (NULL, src->size, PROT_READ, MAP_SHARED, src->fd, 0);
+ madvise (src->map,src->size, 2);
+ /* collapse state if that failed */
+ if (src->map == NULL) {
+ close (src->fd);
+ gst_element_error (GST_ELEMENT (src),"mmapping file");
+ return FALSE;
+ }
+ GST_FLAG_SET (src, GST_MULTIDISKSRC_OPEN);
+ src->new_seek = TRUE;
+ }
+ return TRUE;
+}
+
+/* unmap and close the file */
+static void
+gst_multidisksrc_close_file (GstMultiDiskSrc *src)
+{
+ g_return_if_fail (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN));
+
+ /* unmap the file from memory and close the file */
+ munmap (src->map, src->size);
+ close (src->fd);
+
+ /* zero out a lot of our state */
+ src->fd = 0;
+ src->size = 0;
+ src->map = NULL;
+ src->new_seek = FALSE;
+
+ GST_FLAG_UNSET (src, GST_MULTIDISKSRC_OPEN);
+}
+
+static GstElementStateReturn
+gst_multidisksrc_change_state (GstElement *element)
+{
+ g_return_val_if_fail (GST_IS_MULTIDISKSRC (element), GST_STATE_FAILURE);
+
+ if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
+ if (GST_FLAG_IS_SET (element, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file (GST_MULTIDISKSRC (element));
+ }
+
+ if (GST_ELEMENT_CLASS (parent_class)->change_state)
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+ return GST_STATE_SUCCESS;
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.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_MULTIDISKSRC_H__
+#define __GST_MULTIDISKSRC_H__
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+GstElementDetails gst_multidisksrc_details;
+
+#define GST_TYPE_MULTIDISKSRC \
+ (gst_multidisksrc_get_type())
+#define GST_MULTIDISKSRC(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrc))
+#define GST_MULTIDISKSRC_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrcClass))
+#define GST_IS_MULTIDISKSRC(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_MULTIDISKSRC))
+#define GST_IS_MULTIDISKSRC_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIDISKSRC))
+
+typedef enum {
+ GST_MULTIDISKSRC_OPEN = GST_ELEMENT_FLAG_LAST,
+
+ GST_MULTIDISKSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2,
+} GstMultiDiskSrcFlags;
+
+typedef struct _GstMultiDiskSrc GstMultiDiskSrc;
+typedef struct _GstMultiDiskSrcClass GstMultiDiskSrcClass;
+
+struct _GstMultiDiskSrc {
+ GstElement element;
+ /* pads */
+ GstPad *srcpad;
+
+ /* current file details */
+ gchar *currentfilename;
+ GSList *listptr;
+
+ /* mapping parameters */
+ gint fd;
+ gulong size; /* how long is the file? */
+ guchar *map; /* where the file is mapped to */
+
+ gboolean new_seek;
+};
+
+struct _GstMultiDiskSrcClass {
+ GstElementClass parent_class;
+
+ void (*new_file) (GstMultiDiskSrc *multidisksrc, gchar *newfilename);
+};
+
+GtkType gst_multidisksrc_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GST_MULTIDISKSRC_H__ */
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.c:
+ *
+ * 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/mman.h>
+
+//#define GST_DEBUG_ENABLED
+
+#include "gstmultidisksrc.h"
+
+GstElementDetails gst_multidisksrc_details = {
+ "Multi Disk Source",
+ "Source/File",
+ "Read from multiple files in order",
+ VERSION,
+ "Dominic Ludlam <dom@openfx.org>",
+ "(C) 2001",
+};
+
+/* DiskSrc signals and args */
+enum {
+ NEW_FILE,
+ LAST_SIGNAL
+};
+
+enum {
+ ARG_0,
+ ARG_LOCATIONS,
+};
+
+static void gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass);
+static void gst_multidisksrc_init (GstMultiDiskSrc *disksrc);
+
+static void gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id);
+static void gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id);
+
+static GstBuffer * gst_multidisksrc_get (GstPad *pad);
+//static GstBuffer * gst_multidisksrc_get_region (GstPad *pad,GstRegionType type,guint64 offset,guint64 len);
+
+static GstElementStateReturn gst_multidisksrc_change_state (GstElement *element);
+
+static gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad);
+static void gst_multidisksrc_close_file (GstMultiDiskSrc *src);
+
+static GstElementClass *parent_class = NULL;
+static guint gst_multidisksrc_signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+gst_multidisksrc_get_type(void)
+{
+ static GtkType multidisksrc_type = 0;
+
+ if (!multidisksrc_type) {
+ static const GtkTypeInfo multidisksrc_info = {
+ "GstMultiDiskSrc",
+ sizeof(GstMultiDiskSrc),
+ sizeof(GstMultiDiskSrcClass),
+ (GtkClassInitFunc)gst_multidisksrc_class_init,
+ (GtkObjectInitFunc)gst_multidisksrc_init,
+ (GtkArgSetFunc)gst_multidisksrc_set_arg,
+ (GtkArgGetFunc)gst_multidisksrc_get_arg,
+ (GtkClassInitFunc)NULL,
+ };
+ multidisksrc_type = gtk_type_unique (GST_TYPE_ELEMENT, &multidisksrc_info);
+ }
+ return multidisksrc_type;
+}
+
+static void
+gst_multidisksrc_class_init (GstMultiDiskSrcClass *klass)
+{
+ GtkObjectClass *gtkobject_class;
+ GstElementClass *gstelement_class;
+
+ gtkobject_class = (GtkObjectClass*)klass;
+ gstelement_class = (GstElementClass*)klass;
+
+ parent_class = gtk_type_class (GST_TYPE_ELEMENT);
+
+ gst_multidisksrc_signals[NEW_FILE] =
+ gtk_signal_new ("new_file", GTK_RUN_LAST, gtkobject_class->type,
+ GTK_SIGNAL_OFFSET (GstMultiDiskSrcClass, new_file),
+ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
+ GTK_TYPE_POINTER);
+ gtk_object_class_add_signals (gtkobject_class, gst_multidisksrc_signals, LAST_SIGNAL);
+
+ gtk_object_add_arg_type ("GstMultiDiskSrc::locations", GTK_TYPE_POINTER,
+ GTK_ARG_READWRITE, ARG_LOCATIONS);
+
+ gtkobject_class->set_arg = gst_multidisksrc_set_arg;
+ gtkobject_class->get_arg = gst_multidisksrc_get_arg;
+
+ gstelement_class->change_state = gst_multidisksrc_change_state;
+}
+
+static void
+gst_multidisksrc_init (GstMultiDiskSrc *multidisksrc)
+{
+// GST_FLAG_SET (disksrc, GST_SRC_);
+
+ multidisksrc->srcpad = gst_pad_new ("src", GST_PAD_SRC);
+ gst_pad_set_get_function (multidisksrc->srcpad,gst_multidisksrc_get);
+// gst_pad_set_getregion_function (multidisksrc->srcpad,gst_multidisksrc_get_region);
+ gst_element_add_pad (GST_ELEMENT (multidisksrc), multidisksrc->srcpad);
+
+ multidisksrc->listptr = NULL;
+ multidisksrc->currentfilename = NULL;
+ multidisksrc->fd = 0;
+ multidisksrc->size = 0;
+ multidisksrc->map = NULL;
+ multidisksrc->new_seek = FALSE;
+}
+
+static void
+gst_multidisksrc_set_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch(id) {
+ case ARG_LOCATIONS:
+ /* the element must be stopped in order to do this */
+ g_return_if_fail (GST_STATE (src) < GST_STATE_PLAYING);
+
+ /* clear the filename if we get a NULL */
+ if (GTK_VALUE_POINTER (*arg) == NULL) {
+ gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
+ src->listptr = NULL;
+ /* otherwise set the new filenames */
+ } else {
+ src->listptr = GTK_VALUE_POINTER(*arg);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+gst_multidisksrc_get_arg (GtkObject *object, GtkArg *arg, guint id)
+{
+ GstMultiDiskSrc *src;
+
+ /* it's not null if we got it, but it might not be ours */
+ g_return_if_fail (GST_IS_MULTIDISKSRC (object));
+
+ src = GST_MULTIDISKSRC (object);
+
+ switch (id) {
+ case ARG_LOCATIONS:
+ GTK_VALUE_POINTER (*arg) = src->listptr;
+ break;
+ default:
+ arg->type = GTK_TYPE_INVALID;
+ break;
+ }
+}
+
+/**
+ * gst_disksrc_get:
+ * @pad: #GstPad to push a buffer from
+ *
+ * Push a new buffer from the disksrc at the current offset.
+ */
+static GstBuffer *
+gst_multidisksrc_get (GstPad *pad)
+{
+ GstMultiDiskSrc *src;
+ GstBuffer *buf;
+ GSList *list;
+
+ g_return_val_if_fail (pad != NULL, NULL);
+ src = GST_MULTIDISKSRC (gst_pad_get_parent (pad));
+
+ if (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file(src);
+
+ if (!src->listptr) {
+ gst_pad_set_eos(pad);
+ return FALSE;
+ }
+
+ list = src->listptr;
+ src->currentfilename = (gchar *) list->data;
+ src->listptr = src->listptr->next;
+
+ if (!gst_multidisksrc_open_file(src, pad))
+ return NULL;
+
+ // emitted after the open, as the user may free the list and string from here
+ gtk_signal_emit(GTK_OBJECT(src), gst_multidisksrc_signals[NEW_FILE], list);
+
+ /* create the buffer */
+ // FIXME: should eventually use a bufferpool for this
+ buf = gst_buffer_new ();
+
+ g_return_val_if_fail (buf != NULL, NULL);
+
+ /* simply set the buffer to point to the correct region of the file */
+ GST_BUFFER_DATA (buf) = src->map;
+ GST_BUFFER_OFFSET (buf) = 0;
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_DONTFREE);
+
+ if (src->new_seek) {
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLUSH);
+ src->new_seek = FALSE;
+ }
+
+ /* we're done, return the buffer */
+ return buf;
+}
+
+/* open the file and mmap it, necessary to go to READY state */
+static
+gboolean gst_multidisksrc_open_file (GstMultiDiskSrc *src, GstPad *srcpad)
+{
+ g_return_val_if_fail (!GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN), FALSE);
+
+ /* open the file */
+ src->fd = open ((const char *) src->currentfilename, O_RDONLY);
+
+ if (src->fd < 0) {
+ perror ("open");
+ gst_element_error (GST_ELEMENT (src), g_strconcat("opening file \"", src->currentfilename, "\"", NULL));
+ return FALSE;
+ } else {
+ /* find the file length */
+ src->size = lseek (src->fd, 0, SEEK_END);
+ lseek (src->fd, 0, SEEK_SET);
+ /* map the file into memory */
+ src->map = mmap (NULL, src->size, PROT_READ, MAP_SHARED, src->fd, 0);
+ madvise (src->map,src->size, 2);
+ /* collapse state if that failed */
+ if (src->map == NULL) {
+ close (src->fd);
+ gst_element_error (GST_ELEMENT (src),"mmapping file");
+ return FALSE;
+ }
+ GST_FLAG_SET (src, GST_MULTIDISKSRC_OPEN);
+ src->new_seek = TRUE;
+ }
+ return TRUE;
+}
+
+/* unmap and close the file */
+static void
+gst_multidisksrc_close_file (GstMultiDiskSrc *src)
+{
+ g_return_if_fail (GST_FLAG_IS_SET (src, GST_MULTIDISKSRC_OPEN));
+
+ /* unmap the file from memory and close the file */
+ munmap (src->map, src->size);
+ close (src->fd);
+
+ /* zero out a lot of our state */
+ src->fd = 0;
+ src->size = 0;
+ src->map = NULL;
+ src->new_seek = FALSE;
+
+ GST_FLAG_UNSET (src, GST_MULTIDISKSRC_OPEN);
+}
+
+static GstElementStateReturn
+gst_multidisksrc_change_state (GstElement *element)
+{
+ g_return_val_if_fail (GST_IS_MULTIDISKSRC (element), GST_STATE_FAILURE);
+
+ if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
+ if (GST_FLAG_IS_SET (element, GST_MULTIDISKSRC_OPEN))
+ gst_multidisksrc_close_file (GST_MULTIDISKSRC (element));
+ }
+
+ if (GST_ELEMENT_CLASS (parent_class)->change_state)
+ return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
+ return GST_STATE_SUCCESS;
+}
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Dominic Ludlam <dom@recoil.org>
+ *
+ * gstmultidisksrc.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_MULTIDISKSRC_H__
+#define __GST_MULTIDISKSRC_H__
+
+#include <gst/gst.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+GstElementDetails gst_multidisksrc_details;
+
+#define GST_TYPE_MULTIDISKSRC \
+ (gst_multidisksrc_get_type())
+#define GST_MULTIDISKSRC(obj) \
+ (GTK_CHECK_CAST((obj),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrc))
+#define GST_MULTIDISKSRC_CLASS(klass) \
+ (GTK_CHECK_CLASS_CAST((klass),GST_TYPE_MULTIDISKSRC,GstMultiDiskSrcClass))
+#define GST_IS_MULTIDISKSRC(obj) \
+ (GTK_CHECK_TYPE((obj),GST_TYPE_MULTIDISKSRC))
+#define GST_IS_MULTIDISKSRC_CLASS(obj) \
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_MULTIDISKSRC))
+
+typedef enum {
+ GST_MULTIDISKSRC_OPEN = GST_ELEMENT_FLAG_LAST,
+
+ GST_MULTIDISKSRC_FLAG_LAST = GST_ELEMENT_FLAG_LAST + 2,
+} GstMultiDiskSrcFlags;
+
+typedef struct _GstMultiDiskSrc GstMultiDiskSrc;
+typedef struct _GstMultiDiskSrcClass GstMultiDiskSrcClass;
+
+struct _GstMultiDiskSrc {
+ GstElement element;
+ /* pads */
+ GstPad *srcpad;
+
+ /* current file details */
+ gchar *currentfilename;
+ GSList *listptr;
+
+ /* mapping parameters */
+ gint fd;
+ gulong size; /* how long is the file? */
+ guchar *map; /* where the file is mapped to */
+
+ gboolean new_seek;
+};
+
+struct _GstMultiDiskSrcClass {
+ GstElementClass parent_class;
+
+ void (*new_file) (GstMultiDiskSrc *multidisksrc, gchar *newfilename);
+};
+
+GtkType gst_multidisksrc_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GST_MULTIDISKSRC_H__ */
* Boston, MA 02111-1307, USA.
*/
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/soundcard.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
src->volume = 1.0;
gst_sinesrc_update_vol_scale(src);
- src->format = AFMT_S16_LE;
+ src->format = 16;
src->samplerate = 44100;
src->freq = 100.0;
+ src->newcaps = FALSE;
src->table_pos = 0.0;
src->table_size = 1024;
src->seq = 0;
- src->sentmeta = FALSE;
}
static GstBuffer *
)* src->vol_scale;
}
- if (!src->sentmeta) {
- MetaAudioRaw *newmeta = g_new(MetaAudioRaw,1);
- memcpy(newmeta,&src->meta,sizeof(MetaAudioRaw));
- gst_buffer_add_meta(buf,GST_META(newmeta));
- src->sentmeta = TRUE;
+ if (src->newcaps) {
+ src->newcaps = FALSE;
}
//g_print(">");
table[i] = (gfloat)sin(i * pi2scaled);
}
- g_free(src->table_data);
+ g_free(src->table_data);
src->table_data = table;
}
}
void gst_sinesrc_sync_parms(GstSineSrc *src) {
- src->meta.format = src->format;
- src->meta.channels = 1;
- src->meta.frequency = src->samplerate;
- src->sentmeta = FALSE;
+ src->newcaps = TRUE;
}
#include <config.h>
#include <gst/gst.h>
-#include <gst/meta/audioraw.h>
-
#ifdef __cplusplus
extern "C" {
gint buffer_size;
gulong seq;
- MetaAudioRaw meta;
- gboolean sentmeta;
+ gboolean newcaps;
+
};
struct _GstSineSrcClass {
GstType *autype;
GList *factories;
GstElementFactory *parsefactory;
- GstElement *bin, *disksrc, *parse, *audiosink;
+ GstElement *bin, *disksrc, *parse, *osssink;
GList *padlist;
gst_init(&argc,&argv);
}
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(disksrc),"eos",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(disksrc));
gst_bin_add(GST_BIN(bin),GST_OBJECT(parse));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(parse,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
while(1)
gst_disksrc_push(GST_SRC(disksrc));
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(disksrc));
gst_object_destroy(GST_OBJECT(bin));
g_return_if_fail(parse != NULL);
decode = gst_elementfactory_make("ac3dec","decode");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play");
+ play = gst_elementfactory_make("osssink","play");
g_return_if_fail(play != NULL);
// construct the decode thread
//if (0) {
if (strncmp(gst_pad_get_name(pad), "audio_", 6) == 0) {
// construct internal pipeline elements
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
}
- sink = gst_audiosink_new("audiosink");
+ sink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(src),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
}
- sink = gst_audiosink_new("audiosink");
+ sink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(src),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("mpg123","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("ac3dec","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("mpg123","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("mpg123","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("mpg123","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
mp3factory = gst_elementfactory_find(argv[2]);
else
mp3factory = gst_elementfactory_find("xa");
- sinkfactory = gst_elementfactory_find("audiosink");
+ sinkfactory = gst_elementfactory_find("osssink");
src = gst_elementfactory_create(srcfactory,"src");
g_return_val_if_fail(src != NULL, -1);
g_return_if_fail(parsefactory != NULL);
decodefactory = gst_elementfactory_find("mpg123");
g_return_if_fail(decodefactory != NULL);
- playfactory = gst_elementfactory_find("audiosink");
+ playfactory = gst_elementfactory_find("osssink");
g_return_if_fail(playfactory != NULL);
src = gst_elementfactory_create(srcfactory,"src");
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("ac3dec","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
g_return_if_fail(parse_audio != NULL);
decode = gst_elementfactory_make("mpg123","decode_audio");
g_return_if_fail(decode != NULL);
- play = gst_elementfactory_make("audiosink","play_audio");
+ play = gst_elementfactory_make("osssink","play_audio");
g_return_if_fail(play != NULL);
// create the thread and pack stuff into it
int main(int argc,char *argv[]) {
GList *factories;
GstElementFactory *parsefactory;
- GstElement *bin, *disksrc, *parse, *audiosink;
+ GstElement *bin, *disksrc, *parse, *osssink;
GList *padlist;
guchar *filename;
int i;
}
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(disksrc),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(disksrc));
gst_bin_add(GST_BIN(bin),GST_OBJECT(parse));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(parse,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
for (i=0;i<4;i++) {
g_print("\n");
gst_disksrc_push(GST_SRC(disksrc));
}
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(disksrc));
gst_object_destroy(GST_OBJECT(bin));
}
int main(int argc,char *argv[]) {
- GstElement *bin, *disksrc, *p, *audiosink;
+ GstElement *bin, *disksrc, *p, *osssink;
GList *padlist;
gst_init(&argc,&argv);
g_print("loaded file '%s'\n",gst_disksrc_get_filename(disksrc));
p = gst_plugin_find_elementfactory("pipe");
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(disksrc),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(disksrc));
gst_bin_add(GST_BIN(bin),GST_OBJECT(p));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(p,"sink"));
gst_pad_connect(gst_element_get_pad(p,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
/* set soundcard properties */
- gst_audiosink_set_format(GST_AUDIOSINK(audiosink),AFMT_S16_BE);
- gst_audiosink_set_channels(GST_AUDIOSINK(audiosink),2);
- gst_audiosink_set_frequency(GST_AUDIOSINK(audiosink),44100);
+ gst_osssink_set_format(GST_AUDIOSINK(osssink),AFMT_S16_BE);
+ gst_osssink_set_channels(GST_AUDIOSINK(osssink),2);
+ gst_osssink_set_frequency(GST_AUDIOSINK(osssink),44100);
while(1)
gst_disksrc_push(GST_SRC(disksrc));
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(disksrc));
gst_object_destroy(GST_OBJECT(bin));
}
/* then the play thread and sink */
playthread = gst_thread_new("playthread");
- sinkfactory = gst_elementfactory_find("audiosink");
+ sinkfactory = gst_elementfactory_find("osssink");
sink = gst_elementfactory_create(sinkfactory,"sink");
gst_bin_add(GST_BIN(playthread),GST_ELEMENT(sink));
gst_element_add_ghost_pad(GST_ELEMENT(playthread),
}
int main(int argc,char *argv[]) {
- GstElement *bin, *disksrc, *audiosink;
+ GstElement *bin, *disksrc, *osssink;
GList *padlist;
gst_init(&argc,&argv);
gtk_object_set(GTK_OBJECT(disksrc),"bytesperread",32768,NULL);
g_print("loaded file '%s'\n",gst_disksrc_get_filename(disksrc));
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(disksrc),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(disksrc));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
/* set soundcard properties */
- gst_audiosink_set_format(GST_AUDIOSINK(audiosink),AFMT_S16_BE);
- gst_audiosink_set_channels(GST_AUDIOSINK(audiosink),2);
- gst_audiosink_set_frequency(GST_AUDIOSINK(audiosink),44100);
+ gst_osssink_set_format(GST_AUDIOSINK(osssink),AFMT_S16_BE);
+ gst_osssink_set_channels(GST_AUDIOSINK(osssink),2);
+ gst_osssink_set_frequency(GST_AUDIOSINK(osssink),44100);
while(1)
gst_disksrc_push(GST_SRC(disksrc));
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(disksrc));
gst_object_destroy(GST_OBJECT(bin));
}
int main(int argc,char *argv[]) {
int fd;
- GstElement *pipeline, *audiosrc, *fdsink;
- GstElementFactory *audiosrcfactory, *fdsinkfactory;
+ GstElement *pipeline, *osssrc, *fdsink;
+ GstElementFactory *osssrcfactory, *fdsinkfactory;
GList *padlist;
gst_init(&argc,&argv);
pipeline = GST_ELEMENT(gst_pipeline_new("pipeline"));
- audiosrcfactory = gst_elementfactory_find("audiosrc");
- audiosrc = gst_elementfactory_create(audiosrcfactory,"audiosrc");
+ osssrcfactory = gst_elementfactory_find("osssrc");
+ osssrc = gst_elementfactory_create(osssrcfactory,"osssrc");
fd = open(argv[1],O_CREAT|O_RDWR);
gtk_object_set(GTK_OBJECT(fdsink),"fd",fd,NULL);
/* add objects to the main pipeline */
- gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(audiosrc));
+ gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(osssrc));
gst_bin_add(GST_BIN(pipeline),GST_ELEMENT(fdsink));
/* connect src to sink */
- gst_pad_connect(gst_element_get_pad(audiosrc,"src"),
+ gst_pad_connect(gst_element_get_pad(osssrc,"src"),
gst_element_get_pad(fdsink,"sink"));
g_print("\nok, runnable, hitting 'play'...\n");
guint16 mp3type;
GList *factories;
GstElementFactory *parsefactory;
- GstElement *bin, *src, *parse, *audiosink;
+ GstElement *bin, *src, *parse, *osssink;
GList *padlist;
ghttp_request *pls;
guchar *plsbuf;
}
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(src),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(src));
gst_bin_add(GST_BIN(bin),GST_OBJECT(parse));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(src,"src"),
gst_element_get_pad(parse,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
sleep(5); /* to let the network buffer fill a bit */
gst_httpsrc_push(GST_SRC(src));
}
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(src));
gst_object_destroy(GST_OBJECT(bin));
bin = gst_bin_new("bin");
- srcfactory = gst_elementfactory_find("audiosrc");
+ srcfactory = gst_elementfactory_find("osssrc");
spectrumfactory = gst_elementfactory_find("gstspectrum");
src = gst_elementfactory_create(srcfactory,"src");
}
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(disksrc),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(disksrc));
gst_bin_add(GST_BIN(bin),GST_OBJECT(parse));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(parse,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
while(1)
gst_disksrc_push(GST_SRC(disksrc));
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(disksrc));
gst_object_destroy(GST_OBJECT(bin));
int main(int argc,char *argv[]) {
int fd;
GstPipeline *pipeline;
- GstElement *audiosrc, *videosrc, *fdsink, *encoder, *compress, *video_queue, *video_thread;
- GstElementFactory *audiosrcfactory, *fdsinkfactory, *encoderfactory, *compressfactory;
+ GstElement *osssrc, *videosrc, *fdsink, *encoder, *compress, *video_queue, *video_thread;
+ GstElementFactory *osssrcfactory, *fdsinkfactory, *encoderfactory, *compressfactory;
GstElementFactory *videosrcfactory;
GList *padlist;
pipeline = gst_pipeline_new("pipeline");
- audiosrcfactory = gst_elementfactory_find("audiosrc");
- audiosrc = gst_elementfactory_create(audiosrcfactory,"audiosrc");
+ osssrcfactory = gst_elementfactory_find("osssrc");
+ osssrc = gst_elementfactory_create(osssrcfactory,"osssrc");
videosrcfactory = gst_elementfactory_find("v4lsrc");
videosrc = gst_elementfactory_create(videosrcfactory,"videosrc");
int main(int argc,char *argv[]) {
int fd;
GstPipeline *pipeline;
- GstElement *audiosrc, *videosrc, *fdsink, *encoder, *compress, *video_queue, *video_thread;
- GstElementFactory *audiosrcfactory, *fdsinkfactory, *encoderfactory, *compressfactory;
+ GstElement *osssrc, *videosrc, *fdsink, *encoder, *compress, *video_queue, *video_thread;
+ GstElementFactory *osssrcfactory, *fdsinkfactory, *encoderfactory, *compressfactory;
GstElementFactory *videosrcfactory;
GList *padlist;
pipeline = gst_pipeline_new("pipeline");
- audiosrcfactory = gst_elementfactory_find("audiosrc");
- audiosrc = gst_elementfactory_create(audiosrcfactory,"audiosrc");
+ osssrcfactory = gst_elementfactory_find("osssrc");
+ osssrc = gst_elementfactory_create(osssrcfactory,"osssrc");
videosrcfactory = gst_elementfactory_find("v4lsrc");
videosrc = gst_elementfactory_create(videosrcfactory,"videosrc");
GstType *autype;
GList *factories;
GstElementFactory *parsefactory;
- GstElement *bin, *disksrc, *parse, *audiosink;
+ GstElement *bin, *disksrc, *parse, *osssink;
GList *padlist;
gst_init(&argc,&argv);
}
- audiosink = gst_audiosink_new("audiosink");
+ osssink = gst_osssink_new("osssink");
gtk_signal_connect(GTK_OBJECT(disksrc),"eof",
GTK_SIGNAL_FUNC(eof),NULL);
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin),GST_OBJECT(disksrc));
gst_bin_add(GST_BIN(bin),GST_OBJECT(parse));
- gst_bin_add(GST_BIN(bin),GST_OBJECT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_OBJECT(osssink));
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(parse,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
while(1) {
g_print("\n");
gst_disksrc_push(GST_SRC(disksrc));
}
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(disksrc));
gst_object_destroy(GST_OBJECT(bin));
{
GstElement *bin;
GstElement *effect;
- GstElement *audiosink;
+ GstElement *osssink;
gst_init(&argc,&argv);
//gtk_object_set (GTK_OBJECT (src), "configure", TRUE, NULL);
//gtk_object_set (GTK_OBJECT (src), "show_file_info", TRUE, NULL);
- audiosink = gst_elementfactory_make("audiosink", "audiosink");
- g_return_val_if_fail(audiosink != NULL, -1);
+ osssink = gst_elementfactory_make("osssink", "osssink");
+ g_return_val_if_fail(osssink != NULL, -1);
gst_bin_add(GST_BIN(bin),GST_ELEMENT(src));
gst_bin_add(GST_BIN(bin),GST_ELEMENT(effect));
- gst_bin_add(GST_BIN(bin),GST_ELEMENT(audiosink));
+ gst_bin_add(GST_BIN(bin),GST_ELEMENT(osssink));
gst_pad_connect(gst_element_get_pad(src,"src"),
gst_element_get_pad(effect,"sink"));
gst_pad_connect(gst_element_get_pad(effect,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_element_set_state(GST_ELEMENT(bin),GST_STATE_PLAYING);
main (int argc, char *argv[])
{
GstElement *element;
- GstElement *videosink, *audiosink;
+ GstElement *videosink, *osssink;
GstAutoplug *autoplugger;
GList *testcaps;
gst_init(&argc,&argv);
- audiosink = gst_elementfactory_make ("audiosink", "audiosink");
- g_assert (audiosink != NULL);
+ osssink = gst_elementfactory_make ("osssink", "osssink");
+ g_assert (osssink != NULL);
videosink = gst_elementfactory_make ("videosink", "videosink");
g_assert (videosink != NULL);
gtk_signal_connect (GTK_OBJECT (autoplugger), "new_object", new_object_added, NULL);
element = gst_autoplug_to_caps (autoplugger, testcaps,
- gst_pad_get_caps (gst_element_get_pad (audiosink, "sink")),
+ gst_pad_get_caps (gst_element_get_pad (osssink, "sink")),
gst_pad_get_caps (gst_element_get_pad (videosink, "sink")),
NULL);
g_assert (element != NULL);
gst_init(&argc,&argv);
sink1 = gst_elementfactory_make ("videosink", "videosink");
- sink2 = gst_elementfactory_make ("audiosink", "audiosink");
+ sink2 = gst_elementfactory_make ("osssink", "osssink");
autoplug = gst_autoplugfactory_make ("staticrender");
autoplug2 = gst_autoplugfactory_make ("static");
}
sink1 = gst_elementfactory_make ("videosink", "videosink");
- sink2 = gst_elementfactory_make ("audiosink", "audiosink");
+ sink2 = gst_elementfactory_make ("osssink", "osssink");
element = gst_autoplug_to_renderers (autoplug,
g_list_append (NULL, gst_caps_new_with_props(
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *videosink;
+ GstElement *disksrc, *osssink, *videosink;
GstElement *bin;
GtkWidget *appwindow;
GstCaps *srccaps;
}
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* and an video sink */
videosink = gst_elementfactory_make("videosink", "play_video");
new_element = gst_autoplug_to_renderers (autoplug,
srccaps,
videosink,
- audiosink,
+ osssink,
NULL);
if (!new_element) {
int main(int argc,char *argv[])
{
- GstElement *bin, *disksrc, *parse, *decoder, *audiosink;
+ GstElement *bin, *disksrc, *parse, *decoder, *osssink;
gst_init(&argc,&argv);
parse = gst_elementfactory_make("mp3parse","parse");
decoder = gst_elementfactory_make("mpg123","decoder");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
+ osssink = gst_elementfactory_make("osssink", "play_audio");
/* add objects to the main pipeline */
gst_bin_add(GST_BIN(bin), disksrc);
gst_bin_add(GST_BIN(bin), parse);
gst_bin_add(GST_BIN(bin), decoder);
- gst_bin_add(GST_BIN(bin), audiosink);
+ gst_bin_add(GST_BIN(bin), osssink);
/* connect src to sink */
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_pad_connect(gst_element_get_pad(parse,"src"),
gst_element_get_pad(decoder,"sink"));
gst_pad_connect(gst_element_get_pad(decoder,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
/* start playing */
gst_element_set_state(bin, GST_STATE_PLAYING);
/* stop the bin */
gst_element_set_state(bin, GST_STATE_NULL);
- gst_object_destroy(GST_OBJECT(audiosink));
+ gst_object_destroy(GST_OBJECT(osssink));
gst_object_destroy(GST_OBJECT(parse));
gst_object_destroy(GST_OBJECT(decoder));
gst_object_destroy(GST_OBJECT(disksrc));
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink;
+ GstElement *disksrc, *osssink;
GstElement *pipeline, *thread;
gst_init(&argc,&argv);
GTK_SIGNAL_FUNC(eos),NULL);
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* add objects to the main pipeline */
/*
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
- gst_pipeline_add_sink(GST_PIPELINE(pipeline), audiosink);
+ gst_pipeline_add_sink(GST_PIPELINE(pipeline), osssink);
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("unable to handle stream\n");
#! /bin/sh
for loc in "$@"; do
-../../tools/gstreamer-launch disksrc \""location=$loc"\" ! mp3parse ! mpg123 ! audiosink
+../../tools/gstreamer-launch disksrc \""location=$loc"\" ! mp3parse ! mpg123 ! osssink
done
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *parse, *decode, *queue;
+ GstElement *disksrc, *osssink, *parse, *decode, *queue;
GstElement *bin;
GstElement *thread;
queue = gst_elementfactory_make("queue", "queue");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
gst_bin_use_cothreads (GST_BIN (bin), TRUE);
gst_bin_add(GST_BIN(bin), decode);
gst_bin_add(GST_BIN(bin), queue);
- gst_bin_add(GST_BIN(thread), audiosink);
+ gst_bin_add(GST_BIN(thread), osssink);
gst_bin_add(GST_BIN(bin), thread);
gst_pad_connect(gst_element_get_pad(decode,"src"),
gst_element_get_pad(queue,"sink"));
gst_pad_connect(gst_element_get_pad(queue,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
/* start playing */
gst_element_set_state(GST_ELEMENT(bin), GST_STATE_PLAYING);
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue;
+ GstElement *disksrc, *osssink, *queue;
GstElement *pipeline;
GstElement *thread;
queue = gst_elementfactory_make("queue", "queue");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* add objects to the main pipeline */
/*
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
gst_pipeline_add_sink(GST_PIPELINE(pipeline), queue);
- gst_bin_add(GST_BIN(thread), audiosink);
+ gst_bin_add(GST_BIN(thread), osssink);
gst_pad_connect(gst_element_get_pad(queue,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("cannot autoplug pipeline\n");
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue, *parse, *decode;
+ GstElement *disksrc, *osssink, *queue, *parse, *decode;
GstElement *bin;
GstElement *thread;
queue = gst_elementfactory_make("queue", "queue");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
parse = gst_elementfactory_make("mp3parse", "parse");
decode = gst_elementfactory_make("mpg123", "decode");
gst_bin_add(GST_BIN(thread), parse);
gst_bin_add(GST_BIN(thread), decode);
- gst_bin_add(GST_BIN(thread), audiosink);
+ gst_bin_add(GST_BIN(thread), osssink);
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(queue,"sink"));
gst_pad_connect(gst_element_get_pad(parse,"src"),
gst_element_get_pad(decode,"sink"));
gst_pad_connect(gst_element_get_pad(decode,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_bin_add(GST_BIN(bin), thread);
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue, *queue2, *parse, *decode;
+ GstElement *disksrc, *osssink, *queue, *queue2, *parse, *decode;
GstElement *bin;
GstElement *thread, *thread2;
queue2 = gst_elementfactory_make("queue", "queue2");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
parse = gst_elementfactory_make("mp3parse", "parse");
decode = gst_elementfactory_make("mpg123", "decode");
gst_bin_add(GST_BIN(thread), decode);
gst_bin_add(GST_BIN(thread), queue2);
- gst_bin_add(GST_BIN(thread2), audiosink);
+ gst_bin_add(GST_BIN(thread2), osssink);
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(queue,"sink"));
gst_element_get_pad(queue2,"sink"));
gst_pad_connect(gst_element_get_pad(queue2,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_bin_add(GST_BIN(bin), thread);
gst_bin_add(GST_BIN(bin), thread2);
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink;
+ GstElement *disksrc, *osssink;
GstElement *pipeline;
GstElement *thread;
GTK_SIGNAL_FUNC(eos), thread);
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
/* add objects to the main pipeline */
/*
gst_pipeline_add_src(GST_PIPELINE(pipeline), disksrc);
- gst_pipeline_add_sink(GST_PIPELINE(pipeline), audiosink);
+ gst_pipeline_add_sink(GST_PIPELINE(pipeline), osssink);
if (!gst_pipeline_autoplug(GST_PIPELINE(pipeline))) {
g_print("unable to handle stream\n");
int main(int argc,char *argv[])
{
- GstElement *disksrc, *audiosink, *queue, *queue2, *parse, *decode;
+ GstElement *disksrc, *osssink, *queue, *queue2, *parse, *decode;
GstElement *bin;
GstElement *thread, *thread2;
queue2 = gst_elementfactory_make("queue", "queue2");
/* and an audio sink */
- audiosink = gst_elementfactory_make("audiosink", "play_audio");
- g_assert(audiosink != NULL);
+ osssink = gst_elementfactory_make("osssink", "play_audio");
+ g_assert(osssink != NULL);
parse = gst_elementfactory_make("mp3parse", "parse");
decode = gst_elementfactory_make("mpg123", "decode");
gst_bin_add(GST_BIN(thread), decode);
gst_bin_add(GST_BIN(thread), queue2);
- gst_bin_add(GST_BIN(thread2), audiosink);
+ gst_bin_add(GST_BIN(thread2), osssink);
gst_pad_connect(gst_element_get_pad(disksrc,"src"),
gst_element_get_pad(queue,"sink"));
gst_element_get_pad(queue2,"sink"));
gst_pad_connect(gst_element_get_pad(queue2,"src"),
- gst_element_get_pad(audiosink,"sink"));
+ gst_element_get_pad(osssink,"sink"));
gst_bin_add(GST_BIN(bin), thread);
gst_bin_add(GST_BIN(bin), thread2);
int main(int argc,char *argv[]) {
GstPipeline *pipeline;
- GstElement *paranoia,*queue,*audio_thread,*audiosink;
+ GstElement *paranoia,*queue,*audio_thread,*osssink;
int i;
int track = (argc == 2) ? atoi(argv[1]) : 1;
gtk_object_set(GTK_OBJECT(queue),"max_level",750,NULL);
g_return_val_if_fail(queue != NULL,4);
- audiosink = gst_elementfactory_make("fakesink","audiosink");
- g_return_val_if_fail(audiosink != NULL,4);
+ osssink = gst_elementfactory_make("fakesink","osssink");
+ g_return_val_if_fail(osssink != NULL,4);
gst_bin_add(GST_BIN(pipeline),paranoia);
gst_bin_add(GST_BIN(pipeline),queue);
- gst_bin_add(GST_BIN(audio_thread),audiosink);
+ gst_bin_add(GST_BIN(audio_thread),osssink);
gst_bin_add(GST_BIN(pipeline),audio_thread);
- gst_element_add_ghost_pad(GST_ELEMENT(audio_thread),gst_element_get_pad(audiosink,"sink"),"sink");
+ gst_element_add_ghost_pad(GST_ELEMENT(audio_thread),gst_element_get_pad(osssink,"sink"),"sink");
gst_element_connect(paranoia,"src",queue,"sink");
gst_element_connect(queue,"src",audio_thread,"sink");
A simple commandline looks like:
-./launch disksrc demo.mp3 | mp3parse | mpg123 | audiosink-oss
+./launch disksrc demo.mp3 | mp3parse | mpg123 | osssink
A more complex pipeline looks like:
case GST_PROPS_BOOL_ID_NUM:
printf("Boolean: %s\n",prop->data.bool_data ? "TRUE" : "FALSE");
break;
+ case GST_PROPS_STRING_ID_NUM:
+ printf("String: %s\n",prop->data.string_data.string);
+ break;
case GST_PROPS_FOURCC_ID_NUM:
printf("FourCC: %c%c%c%c\n",
prop->data.fourcc_data & 0xff,prop->data.fourcc_data>>8 & 0xff,