summaryrefslogtreecommitdiffstats
path: root/gst/autodetect
diff options
context:
space:
mode:
authorThomas Vander Stichele <thomas@apestaart.org>2005-11-14 02:13:35 +0000
committerThomas Vander Stichele <thomas@apestaart.org>2005-11-14 02:13:35 +0000
commit6ff59b2f6e36596ee6f347da307de9b61ff92bdd (patch)
tree94b0f7973c99338603968e83bdf8ca2ba60c13e1 /gst/autodetect
parent57b2ee4bb58e2783618d4ccb385dbf782c4ba3b1 (diff)
rework configure.ac; make asterisk rtp stuff compile on mingw
Original commit message from CVS: rework configure.ac; make asterisk rtp stuff compile on mingw
Diffstat (limited to 'gst/autodetect')
-rw-r--r--gst/autodetect/gstautoaudiosink.c50
-rw-r--r--gst/autodetect/gstautodetect.c2
2 files changed, 42 insertions, 10 deletions
diff --git a/gst/autodetect/gstautoaudiosink.c b/gst/autodetect/gstautoaudiosink.c
index 2becffcd..afd7ba9f 100644
--- a/gst/autodetect/gstautoaudiosink.c
+++ b/gst/autodetect/gstautoaudiosink.c
@@ -108,7 +108,7 @@ gst_auto_audio_sink_factory_filter (GstPluginFeature * feature, gpointer data)
/* audio sinks */
klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature));
- if (strcmp (klass, "Sink/Audio") != 0)
+ if (!(strstr (klass, "Sink") && strstr (klass, "Audio")))
return FALSE;
/* only select elements with autoplugging rank */
@@ -137,6 +137,9 @@ gst_auto_audio_sink_find_best (GstAutoAudioSink * sink)
GList *list, *item;
GstElement *choice = NULL;
gboolean ss = TRUE;
+ GstMessage *message = NULL;
+ GSList *errors = NULL;
+ GstBus *bus = gst_bus_new ();
list = gst_registry_feature_filter (gst_registry_get_default (),
(GstPluginFeatureFilter) gst_auto_audio_sink_factory_filter, FALSE, sink);
@@ -145,17 +148,21 @@ gst_auto_audio_sink_find_best (GstAutoAudioSink * sink)
/* FIXME:
* - soundservers have no priority yet.
* - soundserversinks should only be chosen if already running, or if
- * the user explicitely wants this to run... That is not easy.
+ * the user explicitly wants this to run... That is not easy.
*/
while (1) {
- GST_LOG ("Trying to find %s", ss ? "soundservers" : "audio devices");
+ GST_DEBUG_OBJECT (sink, "Trying to find %s",
+ ss ? "soundservers" : "audio devices");
for (item = list; item != NULL; item = item->next) {
GstElementFactory *f = GST_ELEMENT_FACTORY (item->data);
GstElement *el;
if ((el = gst_element_factory_create (f, "actual-sink"))) {
+ /* FIXME: no element actually has this property as far as I can tell.
+ * also, this is a nasty uncheckable way of supporting something that
+ * amounts to being an interface. */
gboolean has_p = g_object_class_find_property (G_OBJECT_GET_CLASS (el),
"soundserver-running") ? TRUE : FALSE;
@@ -165,22 +172,32 @@ gst_auto_audio_sink_find_best (GstAutoAudioSink * sink)
g_object_get (G_OBJECT (el), "soundserver-running", &r, NULL);
if (r) {
- GST_LOG ("%s - soundserver is running",
+ GST_DEBUG_OBJECT (sink, "%s - soundserver is running",
GST_PLUGIN_FEATURE (f)->name);
} else {
- GST_LOG ("%s - Soundserver is not running",
+ GST_DEBUG_OBJECT (sink, "%s - Soundserver is not running",
GST_PLUGIN_FEATURE (f)->name);
goto next;
}
}
- GST_LOG ("Testing %s", GST_PLUGIN_FEATURE (f)->name);
+ GST_DEBUG_OBJECT (sink, "Testing %s", GST_PLUGIN_FEATURE (f)->name);
+ gst_element_set_bus (el, bus);
if (gst_element_set_state (el,
GST_STATE_READY) == GST_STATE_CHANGE_SUCCESS) {
gst_element_set_state (el, GST_STATE_NULL);
- GST_LOG ("This worked!");
+ GST_DEBUG_OBJECT (sink, "This worked!");
choice = el;
goto done;
} else {
+ /* collect all error messages */
+ while ((message = gst_bus_pop (bus))) {
+ if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ERROR) {
+ GST_DEBUG_OBJECT (sink, "appending error message %p", message);
+ errors = g_slist_append (errors, message);
+ } else {
+ gst_message_unref (message);
+ }
+ }
gst_element_set_state (el, GST_STATE_NULL);
}
}
@@ -196,7 +213,24 @@ gst_auto_audio_sink_find_best (GstAutoAudioSink * sink)
}
done:
+ GST_DEBUG_OBJECT (sink, "done trying");
+ if (!choice) {
+ if (errors) {
+ /* FIXME: we forward the first error for now; but later on it might make
+ * sense to actually analyse them */
+ gst_message_ref (GST_MESSAGE (errors->data));
+ GST_DEBUG_OBJECT (sink, "reposting message %p", errors->data);
+ gst_element_post_message (GST_ELEMENT (sink), GST_MESSAGE (errors->data));
+ } else {
+ /* general fallback */
+ GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL),
+ ("Failed to find a supported audio sink"));
+ }
+ }
+ gst_object_unref (bus);
g_list_free (list);
+ g_slist_foreach (errors, (GFunc) gst_mini_object_unref, NULL);
+ g_slist_free (errors);
return choice;
}
@@ -216,8 +250,6 @@ gst_auto_audio_sink_detect (GstAutoAudioSink * sink)
/* find element */
GST_DEBUG_OBJECT (sink, "Creating new kid");
if (!(esink = gst_auto_audio_sink_find_best (sink))) {
- GST_ELEMENT_ERROR (sink, LIBRARY, INIT, (NULL),
- ("Failed to find a supported audio sink"));
return FALSE;
}
sink->kid = esink;
diff --git a/gst/autodetect/gstautodetect.c b/gst/autodetect/gstautodetect.c
index 75f7d6e7..9f02b9c9 100644
--- a/gst/autodetect/gstautodetect.c
+++ b/gst/autodetect/gstautodetect.c
@@ -45,4 +45,4 @@ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"autodetect",
"Plugin contains auto-detection plugins for video/audio outputs",
- plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)
+ plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)