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);
}