Diff
Modified: trunk/Source/WebKit/chromium/ChangeLog (98513 => 98514)
--- trunk/Source/WebKit/chromium/ChangeLog 2011-10-26 20:19:14 UTC (rev 98513)
+++ trunk/Source/WebKit/chromium/ChangeLog 2011-10-26 20:20:09 UTC (rev 98514)
@@ -1,3 +1,28 @@
+2011-10-26 Chris Rogers <crog...@google.com>
+
+ Add chromium bridging for AudioSourceProviderClient and setFormat() method so we can know audio stream format
+ https://bugs.webkit.org/show_bug.cgi?id=70650
+
+ Reviewed by Darin Fisher.
+
+ * WebKit.gyp:
+ * public/WebAudioSourceProvider.h:
+ (WebKit::WebAudioSourceProvider::setClient):
+ * public/WebAudioSourceProviderClient.h: Copied from Source/WebKit/chromium/public/WebAudioSourceProvider.h.
+ (WebKit::WebAudioSourceProviderClient::~WebAudioSourceProviderClient):
+ * public/WebMediaPlayer.h:
+ * src/WebMediaPlayerClientImpl.cpp:
+ (WebKit::WebMediaPlayerClientImpl::loadInternal):
+ (WebKit::WebMediaPlayerClientImpl::audioSourceProvider):
+ (WebKit::WebMediaPlayerClientImpl::AudioSourceProviderImpl::wrap):
+ (WebKit::WebMediaPlayerClientImpl::AudioSourceProviderImpl::setClient):
+ (WebKit::WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput):
+ (WebKit::WebMediaPlayerClientImpl::AudioClientImpl::setFormat):
+ * src/WebMediaPlayerClientImpl.h:
+ (WebKit::WebMediaPlayerClientImpl::AudioClientImpl::AudioClientImpl):
+ (WebKit::WebMediaPlayerClientImpl::AudioClientImpl::~AudioClientImpl):
+ (WebKit::WebMediaPlayerClientImpl::AudioClientImpl::wrap):
+
2011-10-25 Stephen White <senorbla...@chromium.org>
[chromium] Canvas2D should rate-limit drawing to prevent swamping the GPU process.
Modified: trunk/Source/WebKit/chromium/WebKit.gyp (98513 => 98514)
--- trunk/Source/WebKit/chromium/WebKit.gyp 2011-10-26 20:19:14 UTC (rev 98513)
+++ trunk/Source/WebKit/chromium/WebKit.gyp 2011-10-26 20:20:09 UTC (rev 98514)
@@ -114,6 +114,8 @@
'public/WebAttribute.h',
'public/WebAudioBus.h',
'public/WebAudioDevice.h',
+ 'public/WebAudioSourceProvider.h',
+ 'public/WebAudioSourceProviderClient.h',
'public/WebAutofillClient.h',
'public/WebBindings.h',
'public/WebBlob.h',
Modified: trunk/Source/WebKit/chromium/public/WebAudioSourceProvider.h (98513 => 98514)
--- trunk/Source/WebKit/chromium/public/WebAudioSourceProvider.h 2011-10-26 20:19:14 UTC (rev 98513)
+++ trunk/Source/WebKit/chromium/public/WebAudioSourceProvider.h 2011-10-26 20:20:09 UTC (rev 98514)
@@ -28,11 +28,18 @@
#include "WebVector.h"
namespace WebKit {
+
+class WebAudioSourceProviderClient;
// Abstract interface for a pull-model client.
class WebAudioSourceProvider {
public:
+ // provideInput() gets called repeatedly to render time-slices of a continuous audio stream.
virtual void provideInput(const WebVector<float*>& audioData, size_t numberOfFrames) = 0;
+
+ // If a client is set, we call it back when the audio format is available.
+ virtual void setClient(WebAudioSourceProviderClient*) { };
+
virtual ~WebAudioSourceProvider() { }
};
Copied: trunk/Source/WebKit/chromium/public/WebAudioSourceProviderClient.h (from rev 98512, trunk/Source/WebKit/chromium/public/WebAudioSourceProvider.h) (0 => 98514)
--- trunk/Source/WebKit/chromium/public/WebAudioSourceProviderClient.h (rev 0)
+++ trunk/Source/WebKit/chromium/public/WebAudioSourceProviderClient.h 2011-10-26 20:20:09 UTC (rev 98514)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011, Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebAudioSourceProviderClient_h
+#define WebAudioSourceProviderClient_h
+
+namespace WebKit {
+
+class WebAudioSourceProviderClient {
+public:
+ virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0;
+protected:
+ virtual ~WebAudioSourceProviderClient() { }
+};
+
+} // WebKit
+
+#endif // WebAudioSourceProviderClient_h
Modified: trunk/Source/WebKit/chromium/public/WebMediaPlayer.h (98513 => 98514)
--- trunk/Source/WebKit/chromium/public/WebMediaPlayer.h 2011-10-26 20:19:14 UTC (rev 98513)
+++ trunk/Source/WebKit/chromium/public/WebMediaPlayer.h 2011-10-26 20:20:09 UTC (rev 98514)
@@ -38,6 +38,7 @@
namespace WebKit {
class WebAudioSourceProvider;
+class WebAudioSourceProviderClient;
class WebMediaPlayerClient;
class WebURL;
struct WebRect;
Modified: trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp (98513 => 98514)
--- trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp 2011-10-26 20:19:14 UTC (rev 98513)
+++ trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp 2011-10-26 20:20:09 UTC (rev 98514)
@@ -7,6 +7,8 @@
#if ENABLE(VIDEO)
+#include "AudioSourceProvider.h"
+#include "AudioSourceProviderClient.h"
#include "Frame.h"
#include "GraphicsContext.h"
#include "HTMLMediaElement.h"
@@ -230,8 +232,13 @@
{
Frame* frame = static_cast<HTMLMediaElement*>(m_mediaPlayer->mediaPlayerClient())->document()->frame();
m_webMediaPlayer = createWebMediaPlayer(this, frame);
- if (m_webMediaPlayer.get())
+ if (m_webMediaPlayer.get()) {
+#if ENABLE(WEB_AUDIO)
+ // Make sure if we create/re-create the WebMediaPlayer that we update our wrapper.
+ m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider());
+#endif
m_webMediaPlayer->load(KURL(ParsedURLString, m_url));
+ }
}
void WebMediaPlayerClientImpl::cancelLoad()
@@ -546,17 +553,12 @@
return 0;
}
-WebCore::AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider()
+#if ENABLE(WEB_AUDIO)
+AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider()
{
-#if ENABLE(WEB_AUDIO)
- if (m_webMediaPlayer.get()) {
- // Wrap the WebAudioSourceProvider in the form of WebCore::AudioSourceProvider.
- m_audioSourceProvider.initialize(m_webMediaPlayer->audioSourceProvider());
- return &m_audioSourceProvider;
- }
+ return &m_audioSourceProvider;
+}
#endif
- return 0;
-}
#if USE(ACCELERATED_COMPOSITING)
bool WebMediaPlayerClientImpl::supportsAcceleratedRendering() const
@@ -659,13 +661,28 @@
}
#if ENABLE(WEB_AUDIO)
-void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(WebCore::AudioBus* bus, size_t framesToProcess)
+void WebMediaPlayerClientImpl::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* provider)
{
+ if (m_webAudioSourceProvider && m_webAudioSourceProvider != provider)
+ m_webAudioSourceProvider->setClient(0);
+ m_webAudioSourceProvider = provider;
+ if (m_webAudioSourceProvider)
+ m_webAudioSourceProvider->setClient(&m_client);
+}
+
+void WebMediaPlayerClientImpl::AudioSourceProviderImpl::setClient(AudioSourceProviderClient* client)
+{
+ m_client.wrap(client);
+ if (m_webAudioSourceProvider)
+ m_webAudioSourceProvider->setClient(&m_client);
+}
+
+void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(AudioBus* bus, size_t framesToProcess)
+{
ASSERT(bus);
if (!bus)
return;
- ASSERT(m_webAudioSourceProvider);
if (!m_webAudioSourceProvider) {
bus->zero();
return;
@@ -679,6 +696,13 @@
m_webAudioSourceProvider->provideInput(webAudioData, framesToProcess);
}
+
+void WebMediaPlayerClientImpl::AudioClientImpl::setFormat(size_t numberOfChannels, float sampleRate)
+{
+ if (m_client)
+ m_client->setFormat(numberOfChannels, sampleRate);
+}
+
#endif
} // namespace WebKit
Modified: trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h (98513 => 98514)
--- trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h 2011-10-26 20:19:14 UTC (rev 98513)
+++ trunk/Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h 2011-10-26 20:20:09 UTC (rev 98514)
@@ -38,9 +38,12 @@
#include "VideoFrameChromium.h"
#include "VideoFrameProvider.h"
#include "VideoLayerChromium.h"
+#include "WebAudioSourceProviderClient.h"
#include "WebMediaPlayerClient.h"
#include <wtf/OwnPtr.h>
+namespace WebCore { class AudioSourceProviderClient; }
+
namespace WebKit {
class WebAudioSourceProvider;
@@ -126,7 +129,10 @@
virtual unsigned droppedFrameCount() const;
virtual unsigned audioDecodedByteCount() const;
virtual unsigned videoDecodedByteCount() const;
+
+#if ENABLE(WEB_AUDIO)
virtual WebCore::AudioSourceProvider* audioSourceProvider();
+#endif
#if USE(ACCELERATED_COMPOSITING)
virtual bool supportsAcceleratedRendering() const;
@@ -167,7 +173,29 @@
static bool m_isEnabled;
#if ENABLE(WEB_AUDIO)
+ // AudioClientImpl wraps an AudioSourceProviderClient.
+ // When the audio format is known, Chromium calls setFormat() which then dispatches into WebCore.
+
+ class AudioClientImpl : public WebKit::WebAudioSourceProviderClient {
+ public:
+ AudioClientImpl()
+ : m_client(0)
+ {
+ }
+
+ virtual ~AudioClientImpl() { }
+
+ // WebAudioSourceProviderClient
+ virtual void setFormat(size_t numberOfChannels, float sampleRate);
+
+ void wrap(WebCore::AudioSourceProviderClient* client) { m_client = client; }
+
+ private:
+ WebCore::AudioSourceProviderClient* m_client;
+ };
+
// AudioSourceProviderImpl wraps a WebAudioSourceProvider.
+ // provideInput() calls into Chromium to get a rendered audio stream.
class AudioSourceProviderImpl : public WebCore::AudioSourceProvider {
public:
@@ -178,11 +206,16 @@
virtual ~AudioSourceProviderImpl() { }
+ // Wraps the given WebAudioSourceProvider.
+ void wrap(WebAudioSourceProvider*);
+
+ // WebCore::AudioSourceProvider
+ virtual void setClient(WebCore::AudioSourceProviderClient*);
virtual void provideInput(WebCore::AudioBus*, size_t framesToProcess);
- void initialize(WebAudioSourceProvider* provider) { m_webAudioSourceProvider = provider; }
private:
WebAudioSourceProvider* m_webAudioSourceProvider;
+ AudioClientImpl m_client;
};
AudioSourceProviderImpl m_audioSourceProvider;