AudioContext::createMediaStreamSource() must create a provider for local MediaStreams
authorcrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Aug 2012 22:03:38 +0000 (22:03 +0000)
committercrogers@google.com <crogers@google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 13 Aug 2012 22:03:38 +0000 (22:03 +0000)
https://bugs.webkit.org/show_bug.cgi?id=93756

Reviewed by Eric Carlson.

There are two main kinds of MediaStreams (local and from remote peers).
Internally we need to know the difference so a MediaStreamAudioSourceNode will "just work".

Tested by existing test: mediastreamaudiosourcenode.html
Full testing can only be verified by manual tests.

* Modules/mediastream/LocalMediaStream.h:
(LocalMediaStream):
* Modules/mediastream/MediaStream.h:
(WebCore::MediaStream::isLocal):
(MediaStream):
* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::createMediaStreamSource):

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

Source/WebCore/ChangeLog
Source/WebCore/Modules/mediastream/LocalMediaStream.h
Source/WebCore/Modules/mediastream/MediaStream.h
Source/WebCore/Modules/webaudio/AudioContext.cpp

index ddb9295..8342b36 100644 (file)
@@ -1,3 +1,24 @@
+2012-08-13  Chris Rogers  <crogers@google.com>
+
+        AudioContext::createMediaStreamSource() must create a provider for local MediaStreams
+        https://bugs.webkit.org/show_bug.cgi?id=93756
+
+        Reviewed by Eric Carlson.
+
+        There are two main kinds of MediaStreams (local and from remote peers).
+        Internally we need to know the difference so a MediaStreamAudioSourceNode will "just work".
+
+        Tested by existing test: mediastreamaudiosourcenode.html
+        Full testing can only be verified by manual tests.
+
+        * Modules/mediastream/LocalMediaStream.h:
+        (LocalMediaStream):
+        * Modules/mediastream/MediaStream.h:
+        (WebCore::MediaStream::isLocal):
+        (MediaStream):
+        * Modules/webaudio/AudioContext.cpp:
+        (WebCore::AudioContext::createMediaStreamSource):
+
 2012-08-13  Simon Hausmann  <simon.hausmann@nokia.com>
 
         Unreviewed, rolling out r125444.
index e76d434..7c48107 100644 (file)
@@ -40,6 +40,9 @@ public:
 
     void stop();
 
+    // MediaStream
+    virtual bool isLocal() const OVERRIDE { return true; }
+
     // EventTarget
     virtual const AtomicString& interfaceName() const OVERRIDE;
 
index bcdd25d..fc8d667 100644 (file)
@@ -56,6 +56,8 @@ public:
     MediaStreamTrackList* audioTracks() { return m_audioTracks.get(); }
     MediaStreamTrackList* videoTracks() { return m_videoTracks.get(); }
 
+    virtual bool isLocal() const { return false; }
+
     // MediaStreamDescriptorOwner
     virtual void streamEnded() OVERRIDE;
 
index ab8e172..599c8b6 100644 (file)
@@ -401,8 +401,19 @@ PassRefPtr<MediaStreamAudioSourceNode> AudioContext::createMediaStreamSource(Med
     ASSERT(isMainThread());
     lazyInitialize();
 
-    // FIXME: For now we don't give it an AudioSourceProvider, so it will output silence.
-    RefPtr<MediaStreamAudioSourceNode> node = MediaStreamAudioSourceNode::create(this, mediaStream, 0);
+    AudioSourceProvider* provider = 0;
+
+    if (mediaStream->isLocal() && mediaStream->audioTracks()->length())
+        provider = destination()->localAudioInputProvider();
+    else {
+        // FIXME: get a provider for non-local MediaStreams (like from a remote peer).
+        provider = 0;
+    }
+
+    RefPtr<MediaStreamAudioSourceNode> node = MediaStreamAudioSourceNode::create(this, mediaStream, provider);
+
+    // FIXME: Only stereo streams are supported right now. We should be able to accept multi-channel streams.
+    node->setFormat(2, sampleRate());
 
     refNode(node.get()); // context keeps reference until node is disconnected
     return node;