Source/Platform/ChangeLog

 12012-11-19 Tommy Widenflycht <[email protected]>
 2
 3 Add basic implementation for MediaStreamAudioDestinationNode
 4 https://bugs.webkit.org/show_bug.cgi?id=101815
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Adds the consumer interface and related functionality to WebMediaStreamSource.
 9
 10 * chromium/public/WebMediaStreamSource.h:
 11 (WebMediaStreamSourceConsumer):
 12 (WebKit::WebMediaStreamSourceConsumer::~WebMediaStreamSourceConsumer):
 13 (WebKit):
 14 (WebMediaStreamSource):
 15
1162012-11-16 Dana Jansens <[email protected]>
217
318 [chromium] Add conversion between WebTransformation and gfx::Transform

Source/WebCore/ChangeLog

 12012-11-19 Tommy Widenflycht <[email protected]>
 2
 3 Add basic implementation for MediaStreamAudioDestinationNode
 4 https://bugs.webkit.org/show_bug.cgi?id=101815
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Implements an audio destination node which has a MediaStream.
 9 This can be added to a PeerConnection with peerConnection.addStream().
 10 Please see use case (3):
 11 https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/webrtc-integration.html
 12
 13 Test: webaudio/mediastreamaudiodestinationnode.html
 14
 15 * Modules/webaudio/AudioContext.cpp:
 16 (WebCore):
 17 (WebCore::AudioContext::createMediaStreamDestination):
 18 * Modules/webaudio/AudioContext.h:
 19 (WebCore):
 20 (AudioContext):
 21 * Modules/webaudio/AudioContext.idl:
 22 * Modules/webaudio/AudioNode.h:
 23 * Modules/webaudio/MediaStreamAudioDestinationNode.cpp: Added.
 24 (WebCore):
 25 (WebCore::MediaStreamAudioDestinationNode::create):
 26 (WebCore::MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode):
 27 (WebCore::MediaStreamAudioDestinationNode::mediaStreamSource):
 28 (WebCore::MediaStreamAudioDestinationNode::~MediaStreamAudioDestinationNode):
 29 (WebCore::MediaStreamAudioDestinationNode::process):
 30 (WebCore::MediaStreamAudioDestinationNode::reset):
 31 * Modules/webaudio/MediaStreamAudioDestinationNode.h: Added.
 32 (WebCore):
 33 (MediaStreamAudioDestinationNode):
 34 (WebCore::MediaStreamAudioDestinationNode::stream):
 35 * Modules/webaudio/MediaStreamAudioDestinationNode.idl: Added.
 36 * WebCore.gypi:
 37 * platform/chromium/support/WebMediaStreamSource.cpp:
 38 (WebKit::WebMediaStreamSource::extraData):
 39 (WebKit::WebMediaStreamSource::setExtraData):
 40 (WebKit::WebMediaStreamSource::requiresConsumer):
 41 (WebKit):
 42 (ConsumerWrapper):
 43 (WebKit::ConsumerWrapper::ConsumerWrapper):
 44 (WebKit::ConsumerWrapper::consumer):
 45 (WebKit::ConsumerWrapper::consumeAudio):
 46 (WebKit::WebMediaStreamSource::addConsumer):
 47 (WebKit::WebMediaStreamSource::removeConsumer):
 48 * platform/mediastream/MediaStreamSource.cpp:
 49 (WebCore::MediaStreamSource::create):
 50 (WebCore::MediaStreamSource::MediaStreamSource):
 51 (WebCore::MediaStreamSource::addConsumer):
 52 (WebCore):
 53 (WebCore::MediaStreamSource::removeConsumer):
 54 (WebCore::MediaStreamSource::consumeAudio):
 55 * platform/mediastream/MediaStreamSource.h:
 56 (WebCore):
 57 (MediaStreamSourceConsumer):
 58 (WebCore::MediaStreamSourceConsumer::~MediaStreamSourceConsumer):
 59 (MediaStreamSource):
 60 (WebCore::MediaStreamSource::requiresConsumer):
 61 (WebCore::MediaStreamSource::consumers):
 62 * platform/mediastream/RTCPeerConnectionHandler.cpp:
 63 (WebCore::RTCPeerConnectionHandlerDummy::consumeAudio):
 64 (WebCore):
 65
1662012-11-19 Kentaro Hara <[email protected]>
267
368 Unreviewed, rolling out r135114.

Source/Platform/chromium/public/WebMediaStreamSource.h

3434#include "WebCommon.h"
3535#include "WebNonCopyable.h"
3636#include "WebPrivatePtr.h"
 37#include "WebVector.h"
3738
3839namespace WebCore {
3940class MediaStreamSource;

@@namespace WebKit {
4344
4445class WebString;
4546
 47class WebMediaStreamSourceConsumer {
 48public:
 49 virtual ~WebMediaStreamSourceConsumer() { }
 50
 51 virtual void consumeAudio(const WebVector<const float*>&, size_t number_of_frames) = 0;
 52};
 53
4654class WebMediaStreamSource {
4755public:
4856 class ExtraData {

@@public:
9199 WEBKIT_EXPORT ExtraData* extraData() const;
92100 WEBKIT_EXPORT void setExtraData(ExtraData*);
93101
 102 // Only used if if this is a WebAudio source.
 103 // The WebMediaStreamSourceConsumer is not owned, and has to be disposed of separately.
 104 WEBKIT_EXPORT bool requiresConsumer() const;
 105 WEBKIT_EXPORT void addConsumer(WebMediaStreamSourceConsumer*);
 106 WEBKIT_EXPORT void removeConsumer(WebMediaStreamSourceConsumer*);
 107
94108#if WEBKIT_IMPLEMENTATION
95109 WebMediaStreamSource(const WTF::PassRefPtr<WebCore::MediaStreamSource>&);
96110 WebMediaStreamSource& operator=(WebCore::MediaStreamSource*);

Source/WebCore/Modules/webaudio/AudioContext.cpp

6363
6464#if ENABLE(MEDIA_STREAM)
6565#include "MediaStream.h"
 66#include "MediaStreamAudioDestinationNode.h"
6667#include "MediaStreamAudioSourceNode.h"
6768#endif
6869

@@PassRefPtr<MediaStreamAudioSourceNode> AudioContext::createMediaStreamSource(Med
430431 refNode(node.get()); // context keeps reference until node is disconnected
431432 return node;
432433}
 434
 435PassRefPtr<MediaStreamAudioDestinationNode> AudioContext::createMediaStreamDestination()
 436{
 437 // FIXME: support optional argument for number of channels.
 438 // FIXME: default should probably be stereo.
 439 return MediaStreamAudioDestinationNode::create(this, 1);
 440}
 441
433442#endif
434443
435444PassRefPtr<ScriptProcessorNode> AudioContext::createScriptProcessor(size_t bufferSize, ExceptionCode& ec)

Source/WebCore/Modules/webaudio/AudioContext.h

@@class AudioBuffer;
4949class AudioBufferCallback;
5050class AudioBufferSourceNode;
5151class MediaElementAudioSourceNode;
 52class MediaStreamAudioDestinationNode;
5253class MediaStreamAudioSourceNode;
5354class HTMLMediaElement;
5455class ChannelMergerNode;

@@public:
118119#endif
119120#if ENABLE(MEDIA_STREAM)
120121 PassRefPtr<MediaStreamAudioSourceNode> createMediaStreamSource(MediaStream*, ExceptionCode&);
 122 PassRefPtr<MediaStreamAudioDestinationNode> createMediaStreamDestination();
121123#endif
122124 PassRefPtr<GainNode> createGain();
123125 PassRefPtr<BiquadFilterNode> createBiquadFilter();

Source/WebCore/Modules/webaudio/AudioContext.idl

6666#if defined(ENABLE_MEDIA_STREAM) && ENABLE_MEDIA_STREAM
6767 MediaStreamAudioSourceNode createMediaStreamSource(in MediaStream mediaStream)
6868 raises(DOMException);
 69 MediaStreamAudioDestinationNode createMediaStreamDestination();
6970#endif
7071
7172 // Processing nodes

Source/WebCore/Modules/webaudio/AudioNode.h

@@public:
6464 NodeTypeOscillator,
6565 NodeTypeAudioBufferSource,
6666 NodeTypeMediaElementAudioSource,
 67 NodeTypeMediaStreamAudioDestination,
6768 NodeTypeMediaStreamAudioSource,
6869 NodeTypeJavaScript,
6970 NodeTypeBiquadFilter,

Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.cpp

 1/*
 2 * Copyright (C) 2012, Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 23 */
 24
 25#include "config.h"
 26
 27#if ENABLE(WEB_AUDIO) && ENABLE(MEDIA_STREAM)
 28
 29#include "MediaStreamAudioDestinationNode.h"
 30
 31#include "AudioContext.h"
 32#include "AudioNodeInput.h"
 33#include "LocalMediaStream.h"
 34#include "MediaStreamCenter.h"
 35#include "RTCPeerConnectionHandler.h"
 36#include "UUID.h"
 37#include <wtf/Locker.h>
 38
 39namespace WebCore {
 40
 41PassRefPtr<MediaStreamAudioDestinationNode> MediaStreamAudioDestinationNode::create(AudioContext* context, size_t numberOfChannels)
 42{
 43 return adoptRef(new MediaStreamAudioDestinationNode(context, numberOfChannels));
 44}
 45
 46MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* context, size_t numberOfChannels)
 47 : AudioBasicInspectorNode(context, context->sampleRate())
 48 , m_mixBus(numberOfChannels, ProcessingSizeInFrames)
 49{
 50 setNodeType(NodeTypeMediaStreamAudioDestination);
 51
 52 m_source = MediaStreamSource::create(ASCIILiteral("WebAudio-") + createCanonicalUUIDString(), MediaStreamSource::TypeAudio, "MediaStreamAudioDestinationNode", MediaStreamSource::ReadyStateLive, true);
 53 MediaStreamSourceVector audioSources;
 54 audioSources.append(m_source);
 55 MediaStreamSourceVector videoSources;
 56 m_stream = LocalMediaStream::create(context->scriptExecutionContext(), audioSources, videoSources);
 57 MediaStreamCenter::instance().didCreateMediaStream(m_stream->descriptor());
 58
 59 initialize();
 60}
 61
 62MediaStreamSource* MediaStreamAudioDestinationNode::mediaStreamSource()
 63{
 64 return m_source.get();
 65}
 66
 67MediaStreamAudioDestinationNode::~MediaStreamAudioDestinationNode()
 68{
 69 uninitialize();
 70}
 71
 72void MediaStreamAudioDestinationNode::process(size_t numberOfFrames)
 73{
 74 m_mixBus.copyFrom(*input(0)->bus());
 75 m_source->consumeAudio(&m_mixBus, numberOfFrames);
 76}
 77
 78void MediaStreamAudioDestinationNode::reset()
 79{
 80}
 81
 82} // namespace WebCore
 83
 84#endif // ENABLE(WEB_AUDIO) && ENABLE(MEDIA_STREAM)

Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.h

 1/*
 2 * Copyright (C) 2012, Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 23 */
 24
 25#ifndef MediaStreamAudioDestinationNode_h
 26#define MediaStreamAudioDestinationNode_h
 27
 28#if ENABLE(WEB_AUDIO) && ENABLE(MEDIA_STREAM)
 29
 30#include "AudioBasicInspectorNode.h"
 31#include "AudioBus.h"
 32#include "MediaStream.h"
 33#include <wtf/OwnPtr.h>
 34#include <wtf/PassRefPtr.h>
 35
 36namespace WebCore {
 37
 38class AudioContext;
 39
 40class MediaStreamAudioDestinationNode : public AudioBasicInspectorNode {
 41public:
 42 static PassRefPtr<MediaStreamAudioDestinationNode> create(AudioContext*, size_t numberOfChannels);
 43
 44 virtual ~MediaStreamAudioDestinationNode();
 45
 46 MediaStream* stream() { return m_stream.get(); }
 47
 48 // AudioNode.
 49 virtual void process(size_t framesToProcess);
 50 virtual void reset();
 51
 52 MediaStreamSource* mediaStreamSource();
 53
 54private:
 55 MediaStreamAudioDestinationNode(AudioContext*, size_t numberOfChannels);
 56
 57 virtual double tailTime() const OVERRIDE { return 0; }
 58 virtual double latencyTime() const OVERRIDE { return 0; }
 59
 60 // As an audio source, we will never propagate silence.
 61 virtual bool propagatesSilence() const OVERRIDE { return false; }
 62
 63 RefPtr<MediaStream> m_stream;
 64 RefPtr<MediaStreamSource> m_source;
 65 AudioBus m_mixBus;
 66};
 67
 68} // namespace WebCore
 69
 70#endif // ENABLE(WEB_AUDIO) && ENABLE(MEDIA_STREAM)
 71
 72#endif // MediaStreamAudioDestinationNode_h

Source/WebCore/Modules/webaudio/MediaStreamAudioDestinationNode.idl

 1/*
 2 * Copyright (C) 2012, Google Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 23 */
 24
 25[
 26 Conditional=WEB_AUDIO&MEDIA_STREAM,
 27 JSGenerateToJSObject
 28] interface MediaStreamAudioDestinationNode : AudioSourceNode {
 29 readonly attribute MediaStream stream;
 30};

Source/WebCore/WebCore.gypi

917917 'Modules/webaudio/DynamicsCompressorNode.idl',
918918 'Modules/webaudio/ScriptProcessorNode.idl',
919919 'Modules/webaudio/MediaElementAudioSourceNode.idl',
 920 'Modules/webaudio/MediaStreamAudioDestinationNode.idl',
920921 'Modules/webaudio/MediaStreamAudioSourceNode.idl',
921922 'Modules/webaudio/OfflineAudioCompletionEvent.idl',
922923 'Modules/webaudio/OscillatorNode.idl',

17411742 'Modules/webaudio/ScriptProcessorNode.h',
17421743 'Modules/webaudio/MediaElementAudioSourceNode.cpp',
17431744 'Modules/webaudio/MediaElementAudioSourceNode.h',
 1745 'Modules/webaudio/MediaStreamAudioDestinationNode.cpp',
 1746 'Modules/webaudio/MediaStreamAudioDestinationNode.h',
17441747 'Modules/webaudio/MediaStreamAudioSourceNode.cpp',
17451748 'Modules/webaudio/MediaStreamAudioSourceNode.h',
17461749 'Modules/webaudio/OfflineAudioCompletionEvent.cpp',

Source/WebCore/platform/chromium/support/WebMediaStreamSource.cpp

3434
3535#include <public/WebMediaStreamSource.h>
3636
 37#include "AudioBus.h"
3738#include "MediaStreamSource.h"
3839#include <public/WebString.h>
3940#include <wtf/PassOwnPtr.h>

@@private:
121122
122123WebMediaStreamSource::ExtraData* WebMediaStreamSource::extraData() const
123124{
 125 ASSERT(!m_private.isNull());
124126 RefPtr<MediaStreamSource::ExtraData> data = m_private->extraData();
125127 if (!data)
126128 return 0;

@@WebMediaStreamSource::ExtraData* WebMediaStreamSource::extraData() const
129131
130132void WebMediaStreamSource::setExtraData(ExtraData* extraData)
131133{
 134 ASSERT(!m_private.isNull());
132135 m_private->setExtraData(adoptRef(new ExtraDataContainer(extraData)));
133136}
134137
 138bool WebMediaStreamSource::requiresConsumer() const
 139{
 140 ASSERT(!m_private.isNull());
 141 return m_private->requiresConsumer();
 142}
 143
 144class ConsumerWrapper : public WebCore::MediaStreamSourceConsumer {
 145public:
 146 explicit ConsumerWrapper(WebMediaStreamSourceConsumer* consumer) : m_consumer(consumer) { }
 147
 148 virtual void consumeAudio(AudioBus*, size_t numberOfFrames) OVERRIDE;
 149
 150 WebMediaStreamSourceConsumer* consumer() { return m_consumer; }
 151
 152private:
 153 // m_consumer is not owned by this class.
 154 WebMediaStreamSourceConsumer* m_consumer;
 155};
 156
 157void ConsumerWrapper::consumeAudio(AudioBus* bus, size_t numberOfFrames)
 158{
 159 ASSERT(bus);
 160 if (!bus)
 161 return;
 162
 163 // Wrap AudioBus.
 164 size_t numberOfChannels = bus->numberOfChannels();
 165 WebKit::WebVector<const float*> busVector(numberOfChannels);
 166 for (size_t i = 0; i < numberOfChannels; ++i)
 167 busVector[i] = bus->channel(i)->data();
 168
 169 m_consumer->consumeAudio(busVector, numberOfFrames);
 170}
 171
 172void WebMediaStreamSource::addConsumer(WebMediaStreamSourceConsumer* consumer)
 173{
 174 ASSERT(!m_private.isNull() && consumer);
 175
 176 m_private->addConsumer(adoptRef(new ConsumerWrapper(consumer)));
 177}
 178
 179void WebMediaStreamSource::removeConsumer(WebMediaStreamSourceConsumer* consumer)
 180{
 181 ASSERT(!m_private.isNull() && consumer);
 182
 183 Vector<RefPtr<MediaStreamSourceConsumer> > consumers = m_private->consumers();
 184 for (Vector<RefPtr<MediaStreamSourceConsumer> >::iterator it = consumers.begin(); it != consumers.end(); ++it) {
 185 ConsumerWrapper* wrapper = reinterpret_cast<ConsumerWrapper*>((*it).get());
 186 if (wrapper->consumer() == consumer)
 187 m_private->removeConsumer(wrapper);
 188 }
 189}
 190
135191} // namespace WebKit
136192
137193#endif // ENABLE(MEDIA_STREAM)

Source/WebCore/platform/mediastream/MediaStreamSource.cpp

3333#if ENABLE(MEDIA_STREAM)
3434
3535#include "MediaStreamSource.h"
 36#include <wtf/PassOwnPtr.h>
3637
3738namespace WebCore {
3839
39 PassRefPtr<MediaStreamSource> MediaStreamSource::create(const String& id, Type type, const String& name, ReadyState readyState)
 40PassRefPtr<MediaStreamSource> MediaStreamSource::create(const String& id, Type type, const String& name, ReadyState readyState, bool requiresConsumer)
4041{
41  return adoptRef(new MediaStreamSource(id, type, name, readyState));
 42 return adoptRef(new MediaStreamSource(id, type, name, readyState, requiresConsumer));
4243}
4344
44 MediaStreamSource::MediaStreamSource(const String& id, Type type, const String& name, ReadyState readyState)
 45MediaStreamSource::MediaStreamSource(const String& id, Type type, const String& name, ReadyState readyState, bool requiresConsumer)
4546 : m_id(id)
4647 , m_type(type)
4748 , m_name(name)
4849 , m_readyState(readyState)
 50 , m_requiresConsumer(requiresConsumer)
4951{
5052}
5153

@@void MediaStreamSource::removeObserver(MediaStreamSource::Observer* observer)
7173 m_observers.remove(pos);
7274}
7375
 76void MediaStreamSource::addConsumer(PassRefPtr<MediaStreamSourceConsumer> consumer)
 77{
 78 m_consumers.append(consumer);
 79}
 80
 81void MediaStreamSource::removeConsumer(MediaStreamSourceConsumer* consumer)
 82{
 83 size_t pos = m_consumers.find(consumer);
 84 if (pos != notFound)
 85 m_consumers.remove(pos);
 86}
 87
 88void MediaStreamSource::consumeAudio(AudioBus* bus, size_t numberOfFrames)
 89{
 90 for (Vector<RefPtr<MediaStreamSourceConsumer> >::iterator it = m_consumers.begin(); it != m_consumers.end(); ++it)
 91 (*it)->consumeAudio(bus, numberOfFrames);
 92}
 93
7494} // namespace WebCore
7595
7696#endif // ENABLE(MEDIA_STREAM)

Source/WebCore/platform/mediastream/MediaStreamSource.h

4040
4141namespace WebCore {
4242
 43class AudioBus;
 44class RTCPeerConnectionHandler;
 45
 46class MediaStreamSourceConsumer : public RefCounted<MediaStreamSourceConsumer> {
 47public:
 48 virtual ~MediaStreamSourceConsumer() { }
 49
 50 virtual void consumeAudio(AudioBus*, size_t numberOfFrames) = 0;
 51};
 52
4353class MediaStreamSource : public RefCounted<MediaStreamSource> {
4454public:
4555 class Observer {

@@public:
6474 ReadyStateEnded = 2
6575 };
6676
67  static PassRefPtr<MediaStreamSource> create(const String& id, Type, const String& name, ReadyState = ReadyStateLive);
 77 static PassRefPtr<MediaStreamSource> create(const String& id, Type, const String& name, ReadyState = ReadyStateLive, bool requiresConsumer = false);
6878
6979 const String& id() const { return m_id; }
7080 Type type() const { return m_type; }

@@public:
7989 PassRefPtr<ExtraData> extraData() const { return m_extraData; }
8090 void setExtraData(PassRefPtr<ExtraData> extraData) { m_extraData = extraData; }
8191
 92 void consumeAudio(AudioBus*, size_t numberOfFrames);
 93
 94 bool requiresConsumer() const { return m_requiresConsumer; }
 95 void addConsumer(PassRefPtr<MediaStreamSourceConsumer>);
 96 void removeConsumer(MediaStreamSourceConsumer*);
 97 Vector<RefPtr<MediaStreamSourceConsumer> > consumers() { return m_consumers; }
 98
8299private:
83  MediaStreamSource(const String& id, Type, const String& name, ReadyState);
 100 MediaStreamSource(const String& id, Type, const String& name, ReadyState, bool requiresConsumer);
84101
85102 String m_id;
86103 Type m_type;
87104 String m_name;
88105 ReadyState m_readyState;
 106 bool m_requiresConsumer;
89107 Vector<Observer*> m_observers;
 108 Vector<RefPtr<MediaStreamSourceConsumer> > m_consumers;
90109 RefPtr<ExtraData> m_extraData;
91110};
92111

Source/WebCore/platform/mediastream/RTCPeerConnectionHandler.cpp

@@void RTCPeerConnectionHandlerDummy::stop()
145145{
146146}
147147
 148void RTCPeerConnectionHandlerDummy::consumeAudio(AudioBus*, size_t)
 149{
 150}
 151
148152bool RTCPeerConnectionHandlerDummy::openDataChannel(PassRefPtr<RTCDataChannelDescriptor>)
149153{
150154 return false;

Tools/ChangeLog

 12012-11-19 Tommy Widenflycht <[email protected]>
 2
 3 Add basic implementation for MediaStreamAudioDestinationNode
 4 https://bugs.webkit.org/show_bug.cgi?id=101815
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 Adds a bit of code that exercises the WebKit API.
 9
 10 * DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp:
 11 (MockWebMediaStreamSourceConsumer):
 12 (MockWebMediaStreamSourceConsumer::~MockWebMediaStreamSourceConsumer):
 13 (MockWebMediaStreamCenter::didCreateMediaStream):
 14
1152012-11-18 KyungTae Kim <[email protected]>
216
317 [EFL] Not to include "ewk_view_private.h" in Tools

Tools/DumpRenderTree/chromium/MockWebMediaStreamCenter.cpp

@@void MockWebMediaStreamCenter::didStopLocalMediaStream(const WebMediaStreamDescr
8585 videoComponents[i].source().setReadyState(WebMediaStreamSource::ReadyStateEnded);
8686}
8787
88 void MockWebMediaStreamCenter::didCreateMediaStream(WebMediaStreamDescriptor&)
 88class MockWebMediaStreamSourceConsumer : public WebMediaStreamSourceConsumer {
 89public:
 90 virtual ~MockWebMediaStreamSourceConsumer() { }
 91 virtual void consumeAudio(const WebVector<const float*>&, size_t number_of_frames) OVERRIDE { }
 92};
 93
 94void MockWebMediaStreamCenter::didCreateMediaStream(WebMediaStreamDescriptor& stream)
8995{
 96 WebVector<WebMediaStreamComponent> audioComponents;
 97 stream.audioSources(audioComponents);
 98 for (size_t i = 0; i < audioComponents.size(); ++i) {
 99 WebMediaStreamSource source = audioComponents[i].source();
 100 if (source.requiresConsumer()) {
 101 MockWebMediaStreamSourceConsumer* consumer = new MockWebMediaStreamSourceConsumer();
 102 source.addConsumer(consumer);
 103 source.removeConsumer(consumer);
 104 delete consumer;
 105 }
 106 }
90107}
91108
92109#endif // ENABLE(MEDIA_STREAM)

LayoutTests/ChangeLog

 12012-11-19 Tommy Widenflycht <[email protected]>
 2
 3 Add basic implementation for MediaStreamAudioDestinationNode
 4 https://bugs.webkit.org/show_bug.cgi?id=101815
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 * webaudio/mediastreamaudiodestinationnode-expected.txt: Added.
 9 * webaudio/mediastreamaudiodestinationnode.html: Added.
 10
1112012-11-19 Christophe Dumez <[email protected]>
212
313 [EFL] Update expectation for fast/js/global-constructors.html after r135093

LayoutTests/webaudio/mediastreamaudiodestinationnode-expected.txt

 1Basic tests for MediaStreamAudioDestinationNode API.
 2
 3On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 4
 5PASS Destination AudioNode has one input.
 6PASS successfullyParsed is true
 7
 8TEST COMPLETE
 9

LayoutTests/webaudio/mediastreamaudiodestinationnode.html

 1<!DOCTYPE html>
 2
 3<html>
 4<head>
 5<script src="../fast/js/resources/js-test-pre.js"></script>
 6<script src="resources/audio-testing.js"></script>
 7</head>
 8
 9<body>
 10<div id="description"></div>
 11<div id="console"></div>
 12
 13<script>
 14description("Basic tests for MediaStreamAudioDestinationNode API.");
 15
 16var context = 0;
 17
 18function runTest() {
 19 if (window.testRunner) {
 20 testRunner.dumpAsText();
 21 }
 22
 23 context = new webkitAudioContext();
 24
 25 var mediaStreamDestination = context.createMediaStreamDestination();
 26
 27 // Check number of inputs and outputs.
 28 if (mediaStreamDestination.numberOfInputs == 1)
 29 testPassed("Destination AudioNode has one input.");
 30 else
 31 testFailed("Destination AudioNode should have one input.");
 32
 33 // FIXME: We should have no outputs, but since we're implemented using AudioBasicInspectorNode
 34 // we have one.
 35 // if (mediaStreamDestination.numberOfOutputs == 0)
 36 // testPassed("Destination AudioNode has no outputs.");
 37 // else
 38 // testFailed("Destination AudioNode should not have outputs.");
 39
 40 // FIXME: add a test where we create a PeerConnection and call addStream(mediaStreamDestination.stream).
 41
 42 finishJSTest();
 43}
 44
 45runTest();
 46window.successfullyParsed = true;
 47
 48</script>
 49
 50<script src="../fast/js/resources/js-test-post.js"></script>
 51</body>
 52</html>