Add chromium bridging for AudioSourceProviderClient and setFormat() method so we...
authorcrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Oct 2011 20:20:09 +0000 (20:20 +0000)
committercrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Oct 2011 20:20:09 +0000 (20:20 +0000)
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):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@98514 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/WebKit.gyp
Source/WebKit/chromium/public/WebAudioSourceProvider.h
Source/WebKit/chromium/public/WebAudioSourceProviderClient.h [new file with mode: 0644]
Source/WebKit/chromium/public/WebMediaPlayer.h
Source/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
Source/WebKit/chromium/src/WebMediaPlayerClientImpl.h

index acee90f..4f8f20b 100644 (file)
@@ -1,3 +1,28 @@
+2011-10-26  Chris Rogers  <crogers@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  <senorblanco@chromium.org>
 
         [chromium] Canvas2D should rate-limit drawing to prevent swamping the GPU process.
index adc3c3a..1f60c4d 100644 (file)
                 'public/WebAttribute.h',
                 'public/WebAudioBus.h',
                 'public/WebAudioDevice.h',
+                'public/WebAudioSourceProvider.h',
+                'public/WebAudioSourceProviderClient.h',
                 'public/WebAutofillClient.h',
                 'public/WebBindings.h',
                 'public/WebBlob.h',
index 6492589..f5281a8 100644 (file)
 #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() { }
 };
 
diff --git a/Source/WebKit/chromium/public/WebAudioSourceProviderClient.h b/Source/WebKit/chromium/public/WebAudioSourceProviderClient.h
new file mode 100644 (file)
index 0000000..ab21a0e
--- /dev/null
@@ -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
index 1db54d3..edc9a89 100644 (file)
@@ -38,6 +38,7 @@
 namespace WebKit {
 
 class WebAudioSourceProvider;
+class WebAudioSourceProviderClient;
 class WebMediaPlayerClient;
 class WebURL;
 struct WebRect;
index a8c0f3d..97a1b21 100644 (file)
@@ -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 @@ void WebMediaPlayerClientImpl::loadInternal()
 {
     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 @@ unsigned WebMediaPlayerClientImpl::videoDecodedByteCount() const
     return 0;
 }
 
-WebCore::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;
-    }
-#endif
-    return 0;
+AudioSourceProvider* WebMediaPlayerClientImpl::audioSourceProvider()
+{
+    return &m_audioSourceProvider;
 }
+#endif
 
 #if USE(ACCELERATED_COMPOSITING)
 bool WebMediaPlayerClientImpl::supportsAcceleratedRendering() const
@@ -659,13 +661,28 @@ WebMediaPlayerClientImpl::WebMediaPlayerClientImpl()
 }
 
 #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 @@ void WebMediaPlayerClientImpl::AudioSourceProviderImpl::provideInput(WebCore::Au
 
     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
index 341fa9c..fcc1da5 100644 (file)
 #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 @@ public:
     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 @@ private:
     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 @@ private:
 
         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;