From d2bd5e45bd41cdcd2f21d87432f3948ee26b41d0 Mon Sep 17 00:00:00 2001 From: Tim-Philipp Müller Date: Wed, 10 May 2006 11:17:31 +0000 Subject: ext/esd/esdsink.*: Move the esd_get_server_info() into gst_esdsink_open() and fail with a decent error message on err... Original commit message from CVS: * ext/esd/esdsink.c: (gst_esdsink_finalize), (gst_esdsink_getcaps), (gst_esdsink_open), (gst_esdsink_close): * ext/esd/esdsink.h: Move the esd_get_server_info() into gst_esdsink_open() and fail with a decent error message on errors. --- ext/esd/esdsink.c | 76 ++++++++++++++++++++++++++++++------------------------- ext/esd/esdsink.h | 1 + 2 files changed, 42 insertions(+), 35 deletions(-) (limited to 'ext/esd') diff --git a/ext/esd/esdsink.c b/ext/esd/esdsink.c index 7af5033a..ae51ea77 100644 --- a/ext/esd/esdsink.c +++ b/ext/esd/esdsink.c @@ -179,6 +179,7 @@ gst_esdsink_finalize (GObject * object) { GstEsdSink *esdsink = GST_ESDSINK (object); + gst_caps_replace (&esdsink->cur_caps, NULL); g_free (esdsink->host); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -188,53 +189,29 @@ static GstCaps * gst_esdsink_getcaps (GstBaseSink * bsink) { GstEsdSink *esdsink; - GstPadTemplate *pad_template; - GstCaps *caps = NULL; - gint i; - esd_server_info_t *server_info; esdsink = GST_ESDSINK (bsink); - GST_DEBUG_OBJECT (esdsink, "getcaps called"); - - pad_template = gst_static_pad_template_get (&sink_factory); - caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); - /* no fd, we're done with the template caps */ - if (esdsink->ctrl_fd < 0) - goto done; - - /* get server info */ - server_info = esd_get_server_info (esdsink->ctrl_fd); - if (!server_info) - goto no_info; - - GST_DEBUG_OBJECT (esdsink, "got server info rate: %i", server_info->rate); - - for (i = 0; i < caps->structs->len; i++) { - GstStructure *s; - - s = gst_caps_get_structure (caps, i); - gst_structure_set (s, "rate", G_TYPE_INT, server_info->rate, NULL); + if (esdsink->ctrl_fd < 0 || esdsink->cur_caps == NULL) { + GST_LOG_OBJECT (esdsink, "getcaps called, returning template caps"); + return NULL; } - esd_free_server_info (server_info); -done: - return caps; + GST_LOG_OBJECT (esdsink, "returning %" GST_PTR_FORMAT, esdsink->cur_caps); - /* ERRORS */ -no_info: - { - GST_WARNING_OBJECT (esdsink, "couldn't get server info!"); - gst_caps_unref (caps); - return NULL; - } + return gst_caps_ref (esdsink->cur_caps); } static gboolean gst_esdsink_open (GstAudioSink * asink) { - GstEsdSink *esdsink = GST_ESDSINK (asink); + esd_server_info_t *server_info; + GstPadTemplate *pad_template; + GstEsdSink *esdsink; + gint i; + + esdsink = GST_ESDSINK (asink); GST_DEBUG_OBJECT (esdsink, "open"); @@ -242,6 +219,27 @@ gst_esdsink_open (GstAudioSink * asink) if (esdsink->ctrl_fd < 0) goto couldnt_connect; + /* get server info */ + server_info = esd_get_server_info (esdsink->ctrl_fd); + if (!server_info) + goto no_server_info; + + GST_INFO_OBJECT (esdsink, "got server info rate: %i", server_info->rate); + + pad_template = gst_static_pad_template_get (&sink_factory); + esdsink->cur_caps = gst_caps_copy (gst_pad_template_get_caps (pad_template)); + + for (i = 0; i < esdsink->cur_caps->structs->len; i++) { + GstStructure *s; + + s = gst_caps_get_structure (esdsink->cur_caps, i); + gst_structure_set (s, "rate", G_TYPE_INT, server_info->rate, NULL); + } + + esd_free_server_info (server_info); + + GST_INFO_OBJECT (esdsink, "server caps: %" GST_PTR_FORMAT, esdsink->cur_caps); + return TRUE; /* ERRORS */ @@ -252,6 +250,13 @@ couldnt_connect: ("can't open connection to esound server")); return FALSE; } +no_server_info: + { + GST_ELEMENT_ERROR (esdsink, RESOURCE, OPEN_WRITE, + (_("Failed to query sound server capabilities")), + ("couldn't get server info!")); + return FALSE; + } } static gboolean @@ -261,6 +266,7 @@ gst_esdsink_close (GstAudioSink * asink) GST_DEBUG_OBJECT (esdsink, "close"); + gst_caps_replace (&esdsink->cur_caps, NULL); esd_close (esdsink->ctrl_fd); esdsink->ctrl_fd = -1; diff --git a/ext/esd/esdsink.h b/ext/esd/esdsink.h index 9db9afa7..ae69fc89 100644 --- a/ext/esd/esdsink.h +++ b/ext/esd/esdsink.h @@ -50,6 +50,7 @@ struct _GstEsdSink { gchar *host; guint rate; + GstCaps *cur_caps; }; struct _GstEsdSinkClass { -- cgit