summaryrefslogtreecommitdiffstats
path: root/ext/esd
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2003-04-06 13:04:20 +0000
committerWim Taymans <wim.taymans@gmail.com>2003-04-06 13:04:20 +0000
commitedf080d72787a051cb5d70d1f36bfc47a8c7104f (patch)
tree25e64fee34e788f203382e485370112763eb8e59 /ext/esd
parent24cdffaf186b6cdb47f6a3fb2cfb02a6cc4e4374 (diff)
- Better state change function
Original commit message from CVS: - Better state change function - fail when negotiation was not performed - removed properties that are implied by caps - only open device in negotiation
Diffstat (limited to 'ext/esd')
-rw-r--r--ext/esd/esdsink.c149
-rw-r--r--ext/esd/esdsink.h40
2 files changed, 55 insertions, 134 deletions
diff --git a/ext/esd/esdsink.c b/ext/esd/esdsink.c
index 43fe8589..673aee6e 100644
--- a/ext/esd/esdsink.c
+++ b/ext/esd/esdsink.c
@@ -43,9 +43,6 @@ enum {
enum {
ARG_0,
ARG_MUTE,
- ARG_DEPTH,
- ARG_CHANNELS,
- ARG_RATE,
ARG_HOST,
};
@@ -86,8 +83,7 @@ static void gst_esdsink_init (GstEsdsink *esdsink);
static gboolean gst_esdsink_open_audio (GstEsdsink *sink);
static void gst_esdsink_close_audio (GstEsdsink *sink);
static GstElementStateReturn gst_esdsink_change_state (GstElement *element);
-static gboolean gst_esdsink_sync_parms (GstEsdsink *esdsink);
-static GstPadLinkReturn gst_esdsink_sinkconnect (GstPad *pad, GstCaps *caps);
+static GstPadLinkReturn gst_esdsink_sinkconnect (GstPad *pad, GstCaps *caps);
static void gst_esdsink_chain (GstPad *pad, GstBuffer *buf);
@@ -96,39 +92,6 @@ static void gst_esdsink_set_property (GObject *object, guint prop_id,
static void gst_esdsink_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec);
-#define GST_TYPE_ESDSINK_DEPTHS (gst_esdsink_depths_get_type())
-static GType
-gst_esdsink_depths_get_type (void)
-{
- static GType esdsink_depths_type = 0;
- static GEnumValue esdsink_depths[] = {
- {8, "8", "8 Bits"},
- {16, "16", "16 Bits"},
- {0, NULL, NULL},
- };
- if (!esdsink_depths_type) {
- esdsink_depths_type = g_enum_register_static("GstEsdsinkDepths", esdsink_depths);
- }
- return esdsink_depths_type;
-}
-
-#define GST_TYPE_ESDSINK_CHANNELS (gst_esdsink_channels_get_type())
-static GType
-gst_esdsink_channels_get_type (void)
-{
- static GType esdsink_channels_type = 0;
- static GEnumValue esdsink_channels[] = {
- {1, "1", "Mono"},
- {2, "2", "Stereo"},
- {0, NULL, NULL},
- };
- if (!esdsink_channels_type) {
- esdsink_channels_type = g_enum_register_static("GstEsdsinkChannels", esdsink_channels);
- }
- return esdsink_channels_type;
-}
-
-
static GstElementClass *parent_class = NULL;
/*static guint gst_esdsink_signals[LAST_SIGNAL] = { 0 }; */
@@ -167,15 +130,6 @@ gst_esdsink_class_init (GstEsdsinkClass *klass)
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_MUTE,
g_param_spec_boolean("mute","mute","mute",
TRUE,G_PARAM_READWRITE)); /* CHECKME */
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_DEPTH,
- g_param_spec_enum("depth","depth","depth",
- GST_TYPE_ESDSINK_DEPTHS,16,G_PARAM_READWRITE)); /* CHECKME! */
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_CHANNELS,
- g_param_spec_enum("channels","channels","channels",
- GST_TYPE_ESDSINK_CHANNELS,2,G_PARAM_READWRITE)); /* CHECKME! */
- g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_RATE,
- g_param_spec_int("frequency","frequency","frequency",
- G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); /* CHECKME */
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_HOST,
g_param_spec_string("host","host","host",
NULL, G_PARAM_READWRITE)); /* CHECKME */
@@ -198,24 +152,12 @@ gst_esdsink_init(GstEsdsink *esdsink)
esdsink->mute = FALSE;
esdsink->fd = -1;
/* FIXME: get default from somewhere better than just putting them inline. */
- esdsink->format = 16;
- esdsink->depth = 16;
- esdsink->channels = 2;
- esdsink->frequency = 44100;
- esdsink->host = NULL;
-}
-
-static gboolean
-gst_esdsink_sync_parms (GstEsdsink *esdsink)
-{
- g_return_val_if_fail (esdsink != NULL, FALSE);
- g_return_val_if_fail (GST_IS_ESDSINK (esdsink), FALSE);
-
- if (esdsink->fd == -1) return TRUE;
-
- /* Need to set fd to use new parameters: only way to do this is to reopen. */
- gst_esdsink_close_audio (esdsink);
- return gst_esdsink_open_audio (esdsink);
+ esdsink->negotiated = FALSE;
+ esdsink->format = -1;
+ esdsink->depth = -1;
+ esdsink->channels = -1;
+ esdsink->frequency = -1;
+ esdsink->host = getenv ("ESPEAKER");
}
static GstPadLinkReturn
@@ -232,8 +174,11 @@ gst_esdsink_sinkconnect (GstPad *pad, GstCaps *caps)
gst_caps_get_int (caps, "channels", &esdsink->channels);
gst_caps_get_int (caps, "rate", &esdsink->frequency);
- if (gst_esdsink_sync_parms (esdsink))
+ gst_esdsink_close_audio (esdsink);
+ if (gst_esdsink_open_audio (esdsink)) {
+ esdsink->negotiated = TRUE;
return GST_PAD_LINK_OK;
+ }
return GST_PAD_LINK_REFUSED;
}
@@ -243,12 +188,13 @@ gst_esdsink_chain (GstPad *pad, GstBuffer *buf)
{
GstEsdsink *esdsink;
- g_return_if_fail(pad != NULL);
- g_return_if_fail(GST_IS_PAD(pad));
- g_return_if_fail(buf != NULL);
-
esdsink = GST_ESDSINK (gst_pad_get_parent (pad));
+ if (!esdsink->negotiated) {
+ gst_element_error (GST_ELEMENT (esdsink), "not negotiated");
+ goto done;
+ }
+
if (GST_BUFFER_DATA (buf) != NULL) {
if (!esdsink->mute && esdsink->fd >= 0) {
GST_DEBUG (0, "esdsink: fd=%d data=%p size=%d",
@@ -256,6 +202,7 @@ gst_esdsink_chain (GstPad *pad, GstBuffer *buf)
write (esdsink->fd, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
}
}
+done:
gst_buffer_unref (buf);
}
@@ -272,20 +219,8 @@ gst_esdsink_set_property (GObject *object, guint prop_id, const GValue *value, G
case ARG_MUTE:
esdsink->mute = g_value_get_boolean (value);
break;
- case ARG_DEPTH:
- esdsink->depth = g_value_get_enum (value);
- gst_esdsink_sync_parms (esdsink);
- break;
- case ARG_CHANNELS:
- esdsink->channels = g_value_get_enum (value);
- gst_esdsink_sync_parms (esdsink);
- break;
- case ARG_RATE:
- esdsink->frequency = g_value_get_int (value);
- gst_esdsink_sync_parms (esdsink);
- break;
case ARG_HOST:
- if (esdsink->host != NULL) g_free(esdsink->host);
+ g_free(esdsink->host);
if (g_value_get_string (value) == NULL)
esdsink->host = NULL;
else
@@ -301,23 +236,12 @@ gst_esdsink_get_property (GObject *object, guint prop_id, GValue *value, GParamS
{
GstEsdsink *esdsink;
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail(GST_IS_ESDSINK(object));
esdsink = GST_ESDSINK(object);
switch (prop_id) {
case ARG_MUTE:
g_value_set_boolean (value, esdsink->mute);
break;
- case ARG_DEPTH:
- g_value_set_enum (value, esdsink->depth);
- break;
- case ARG_CHANNELS:
- g_value_set_enum (value, esdsink->channels);
- break;
- case ARG_RATE:
- g_value_set_int (value, esdsink->frequency);
- break;
case ARG_HOST:
g_value_set_string (value, esdsink->host);
break;
@@ -382,43 +306,50 @@ gst_esdsink_open_audio (GstEsdsink *sink)
return FALSE;
}
- GST_FLAG_SET (sink, GST_ESDSINK_OPEN);
-
return TRUE;
}
static void
gst_esdsink_close_audio (GstEsdsink *sink)
{
- if (sink->fd < 0) return;
+ if (sink->fd < 0)
+ return;
close(sink->fd);
sink->fd = -1;
- GST_FLAG_UNSET (sink, GST_ESDSINK_OPEN);
-
GST_DEBUG (0, "esdsink: closed sound device");
}
static GstElementStateReturn
gst_esdsink_change_state (GstElement *element)
{
- g_return_val_if_fail (GST_IS_ESDSINK (element), FALSE);
+ GstEsdsink *esdsink;
+
+ esdsink = GST_ESDSINK (element);
- /* if going down into NULL state, close the fd if it's open */
- if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
- if (GST_FLAG_IS_SET (element, GST_ESDSINK_OPEN))
+ switch (GST_STATE_TRANSITION (element)) {
+ case GST_STATE_NULL_TO_READY:
+ break;
+ case GST_STATE_READY_TO_PAUSED:
+ break;
+ case GST_STATE_PAUSED_TO_PLAYING:
+ break;
+ case GST_STATE_PLAYING_TO_PAUSED:
+ break;
+ case GST_STATE_PAUSED_TO_READY:
gst_esdsink_close_audio (GST_ESDSINK (element));
- /* otherwise (READY or higher) we need to open the fd */
- } else {
- if (!GST_FLAG_IS_SET (element, GST_ESDSINK_OPEN)) {
- if (!gst_esdsink_open_audio (GST_ESDSINK (element)))
- return GST_STATE_FAILURE;
- }
+ esdsink->negotiated = FALSE;
+ break;
+ case GST_STATE_READY_TO_NULL:
+ break;
+ default:
+ break;
}
if (GST_ELEMENT_CLASS (parent_class)->change_state)
return GST_ELEMENT_CLASS (parent_class)->change_state (element);
+
return GST_STATE_SUCCESS;
}
diff --git a/ext/esd/esdsink.h b/ext/esd/esdsink.h
index e29e9f7c..de1564ea 100644
--- a/ext/esd/esdsink.h
+++ b/ext/esd/esdsink.h
@@ -23,42 +23,35 @@
#include <gst/gst.h>
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
+G_BEGIN_DECLS
#define GST_TYPE_ESDSINK \
(gst_esdsink_get_type())
#define GST_ESDSINK(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ESDSINK,GstEsdsink))
#define GST_ESDSINK_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESDSINK,GstEsdsink))
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESDSINK,GstEsdsinkClass))
#define GST_IS_ESDSINK(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESDSINK))
#define GST_IS_ESDSINK_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDSINK))
-typedef enum {
- GST_ESDSINK_OPEN = GST_ELEMENT_FLAG_LAST,
- GST_ESDSINK_FLAG_LAST = GST_ELEMENT_FLAG_LAST+2,
-} GstEsdSinkFlags;
-
typedef struct _GstEsdsink GstEsdsink;
typedef struct _GstEsdsinkClass GstEsdsinkClass;
struct _GstEsdsink {
- GstElement element;
-
- GstPad *sinkpad;
-
- gboolean mute;
- int fd;
- gint format;
- gint depth;
- gint channels;
- gint frequency;
- gchar* host;
+ GstElement element;
+
+ GstPad *sinkpad;
+
+ gboolean mute;
+ int fd;
+ gint format;
+ gint depth;
+ gint channels;
+ gint frequency;
+ gboolean negotiated;
+ gchar *host;
};
struct _GstEsdsinkClass {
@@ -68,9 +61,6 @@ struct _GstEsdsinkClass {
GType gst_esdsink_get_type(void);
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
+G_END_DECLS
#endif /* __GST_ESDSINK_H__ */