Title: [98514] trunk/Source/WebKit/chromium
Revision
98514
Author
crog...@google.com
Date
2011-10-26 13:20:09 -0700 (Wed, 26 Oct 2011)

Log Message

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):

Modified Paths

Added Paths

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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to