Title: [131755] trunk/Source/WebCore
Revision
131755
Author
ph...@webkit.org
Date
2012-10-18 08:27:35 -0700 (Thu, 18 Oct 2012)

Log Message

[GTK] AudioBusGtk sometimes fails to load the HRTF database
https://bugs.webkit.org/show_bug.cgi?id=99601

Reviewed by Martin Robinson.

AudioBusGtk now first lookup for the uninstalled resource files,
if the AUDIO_RESOURCES_PATH environment variable is
set. Additionally the audio file reader is now better dealing with
errors, returning an empty AudioBus in such cases and issuing
warnings on the console output. The cleanup of some member
variables was also moved to the destructor.

* platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
(AudioFileReader):
(WebCore::AudioFileReader::AudioFileReader):
(WebCore::AudioFileReader::~AudioFileReader): Clear and free
member variables. This was done in createBus before.
(WebCore::AudioFileReader::handleMessage): Issue warnings in case
of error and exit from the main loop so the pipeline is not
forever stuck.
(WebCore::AudioFileReader::createBus): Return an empty bus in case
of error.
* platform/audio/gtk/AudioBusGtk.cpp:
(WebCore::AudioBus::loadPlatformResource): Load uninstalled
resources first if AUDIO_RESOURCES_PATH is set.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (131754 => 131755)


--- trunk/Source/WebCore/ChangeLog	2012-10-18 15:21:07 UTC (rev 131754)
+++ trunk/Source/WebCore/ChangeLog	2012-10-18 15:27:35 UTC (rev 131755)
@@ -1,3 +1,31 @@
+2012-10-17  Philippe Normand  <pnorm...@igalia.com>
+
+        [GTK] AudioBusGtk sometimes fails to load the HRTF database
+        https://bugs.webkit.org/show_bug.cgi?id=99601
+
+        Reviewed by Martin Robinson.
+
+        AudioBusGtk now first lookup for the uninstalled resource files,
+        if the AUDIO_RESOURCES_PATH environment variable is
+        set. Additionally the audio file reader is now better dealing with
+        errors, returning an empty AudioBus in such cases and issuing
+        warnings on the console output. The cleanup of some member
+        variables was also moved to the destructor.
+
+        * platform/audio/gstreamer/AudioFileReaderGStreamer.cpp:
+        (AudioFileReader):
+        (WebCore::AudioFileReader::AudioFileReader):
+        (WebCore::AudioFileReader::~AudioFileReader): Clear and free
+        member variables. This was done in createBus before.
+        (WebCore::AudioFileReader::handleMessage): Issue warnings in case
+        of error and exit from the main loop so the pipeline is not
+        forever stuck.
+        (WebCore::AudioFileReader::createBus): Return an empty bus in case
+        of error.
+        * platform/audio/gtk/AudioBusGtk.cpp:
+        (WebCore::AudioBus::loadPlatformResource): Load uninstalled
+        resources first if AUDIO_RESOURCES_PATH is set.
+
 2012-10-18  Pavel Feldman  <pfeld...@chromium.org>
 
         Web Inspector: provisional change for merging "doced" state into the "dock side" enum.

Modified: trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp (131754 => 131755)


--- trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp	2012-10-18 15:21:07 UTC (rev 131754)
+++ trunk/Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp	2012-10-18 15:27:35 UTC (rev 131755)
@@ -74,6 +74,7 @@
     GRefPtr<GstElement> m_decodebin;
     GRefPtr<GstElement> m_deInterleave;
     GRefPtr<GMainLoop> m_loop;
+    bool m_errorOccurred;
 };
 
 static GstCaps* getGStreamerAudioCaps(int channels, float sampleRate)
@@ -131,6 +132,7 @@
     , m_dataSize(0)
     , m_filePath(filePath)
     , m_channelSize(0)
+    , m_errorOccurred(false)
 {
 }
 
@@ -139,11 +141,34 @@
     , m_dataSize(dataSize)
     , m_filePath(0)
     , m_channelSize(0)
+    , m_errorOccurred(false)
 {
 }
 
 AudioFileReader::~AudioFileReader()
 {
+    if (m_pipeline) {
+        GRefPtr<GstBus> bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
+        g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(messageCallback), this);
+        gst_element_set_state(m_pipeline, GST_STATE_NULL);
+        gst_object_unref(GST_OBJECT(m_pipeline));
+    }
+
+    if (m_decodebin) {
+        g_signal_handlers_disconnect_by_func(m_decodebin.get(), reinterpret_cast<gpointer>(onGStreamerDecodebinPadAddedCallback), this);
+        m_decodebin.clear();
+    }
+
+    if (m_deInterleave) {
+        g_signal_handlers_disconnect_by_func(m_deInterleave.get(), reinterpret_cast<gpointer>(onGStreamerDeinterleavePadAddedCallback), this);
+        g_signal_handlers_disconnect_by_func(m_deInterleave.get(), reinterpret_cast<gpointer>(onGStreamerDeinterleaveReadyCallback), this);
+        m_deInterleave.clear();
+    }
+
+    gst_buffer_list_iterator_free(m_frontLeftBuffersIterator);
+    gst_buffer_list_iterator_free(m_frontRightBuffersIterator);
+    gst_buffer_list_unref(m_frontLeftBuffers);
+    gst_buffer_list_unref(m_frontRightBuffers);
 }
 
 GstFlowReturn AudioFileReader::handleBuffer(GstAppSink* sink)
@@ -211,11 +236,13 @@
         break;
     case GST_MESSAGE_WARNING:
         gst_message_parse_warning(message, &error.outPtr(), &debug.outPtr());
-        g_warning("Warning: %d, %s", error->code,  error->message);
+        g_warning("Warning: %d, %s. Debug output: %s", error->code,  error->message, debug.get());
         break;
     case GST_MESSAGE_ERROR:
         gst_message_parse_error(message, &error.outPtr(), &debug.outPtr());
-        ASSERT_WITH_MESSAGE(0, "Fatal error: %d, %s", error->code,  error->message);
+        g_warning("Error: %d, %s. Debug output: %s", error->code,  error->message, debug.get());
+        m_errorOccurred = true;
+        g_main_loop_quit(m_loop.get());
         break;
     default:
         break;
@@ -351,31 +378,17 @@
     g_main_loop_run(m_loop.get());
     g_main_context_pop_thread_default(context.get());
 
-    GRefPtr<GstBus> bus = gst_pipeline_get_bus(GST_PIPELINE(m_pipeline));
-    g_signal_handlers_disconnect_by_func(bus.get(), reinterpret_cast<gpointer>(messageCallback), this);
-
-    g_signal_handlers_disconnect_by_func(m_decodebin.get(), reinterpret_cast<gpointer>(onGStreamerDecodebinPadAddedCallback), this);
-    g_signal_handlers_disconnect_by_func(m_deInterleave.get(), reinterpret_cast<gpointer>(onGStreamerDeinterleavePadAddedCallback), this);
-    g_signal_handlers_disconnect_by_func(m_deInterleave.get(), reinterpret_cast<gpointer>(onGStreamerDeinterleaveReadyCallback), this);
-
     unsigned channels = mixToMono ? 1 : 2;
     OwnPtr<AudioBus> audioBus = adoptPtr(new AudioBus(channels, m_channelSize, true));
     audioBus->setSampleRate(m_sampleRate);
 
+    if (m_errorOccurred)
+        return audioBus.release();
+
     copyGstreamerBuffersToAudioChannel(m_frontLeftBuffers, audioBus->channel(0));
     if (!mixToMono)
         copyGstreamerBuffersToAudioChannel(m_frontRightBuffers, audioBus->channel(1));
 
-    gst_buffer_list_iterator_free(m_frontLeftBuffersIterator);
-    gst_buffer_list_iterator_free(m_frontRightBuffersIterator);
-    gst_buffer_list_unref(m_frontLeftBuffers);
-    gst_buffer_list_unref(m_frontRightBuffers);
-
-    gst_element_set_state(m_pipeline, GST_STATE_NULL);
-    gst_object_unref(GST_OBJECT(m_pipeline));
-
-    m_decodebin.clear();
-    m_deInterleave.clear();
     return audioBus.release();
 }
 

Modified: trunk/Source/WebCore/platform/audio/gtk/AudioBusGtk.cpp (131754 => 131755)


--- trunk/Source/WebCore/platform/audio/gtk/AudioBusGtk.cpp	2012-10-18 15:21:07 UTC (rev 131754)
+++ trunk/Source/WebCore/platform/audio/gtk/AudioBusGtk.cpp	2012-10-18 15:27:35 UTC (rev 131755)
@@ -28,7 +28,6 @@
 #include <wtf/gobject/GOwnPtr.h>
 #include <wtf/text/CString.h>
 
-#include <gio/gio.h>
 #include <glib.h>
 
 namespace WebCore {
@@ -36,14 +35,12 @@
 PassOwnPtr<AudioBus> AudioBus::loadPlatformResource(const char* name, float sampleRate)
 {
     GOwnPtr<gchar> filename(g_strdup_printf("%s.wav", name));
-    GOwnPtr<gchar> absoluteFilename(g_build_filename(sharedResourcesPath().data(), "resources", "audio", filename.get(), NULL));
-
-    GFile* file = g_file_new_for_path(filename.get());
-    if (!g_file_query_exists(file, 0)) {
-        // Uninstalled case, assume we're in the WebKit root directory.
-        const char* environmentPath = getenv("AUDIO_RESOURCES_PATH");
+    const char* environmentPath = getenv("AUDIO_RESOURCES_PATH");
+    GOwnPtr<gchar> absoluteFilename;
+    if (environmentPath)
         absoluteFilename.set(g_build_filename(environmentPath, filename.get(), NULL));
-    }
+    else
+        absoluteFilename.set(g_build_filename(sharedResourcesPath().data(), "resources", "audio", filename.get(), NULL));
     return createBusFromAudioFile(absoluteFilename.get(), false, sampleRate);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to