Commit baae1603 authored by xians@chromium.org's avatar xians@chromium.org

Create one WebAudioSource for each CreateMediaStreamSource() call.

Previously, the media stream track will create one source provider and let WebAudio use it. But this does not work when there are more than 1 WebAudio AudioContexts connecting to the same media stream.
This Cl fixes the problem by creating one source provider for each CreateMediaStreamSource() call.

NOTRY=true

BUG=354468

Review URL: https://codereview.chromium.org/202923007

git-svn-id: svn://svn.chromium.org/blink/trunk@170063 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 8eb43804
......@@ -396,21 +396,18 @@ PassRefPtr<MediaStreamAudioSourceNode> AudioContext::createMediaStreamSource(Med
ASSERT(isMainThread());
lazyInitialize();
AudioSourceProvider* provider = 0;
MediaStreamTrackVector audioTracks = mediaStream->getAudioTracks();
RefPtr<MediaStreamTrack> audioTrack;
// FIXME: get a provider for non-local MediaStreams (like from a remote peer).
for (size_t i = 0; i < audioTracks.size(); ++i) {
audioTrack = audioTracks[i];
if (audioTrack->component()->audioSourceProvider()) {
provider = audioTrack->component()->audioSourceProvider();
break;
}
if (audioTracks.isEmpty()) {
exceptionState.throwDOMException(
InvalidStateError,
"MediaStream has no audio track");
return nullptr;
}
RefPtr<MediaStreamAudioSourceNode> node = MediaStreamAudioSourceNode::create(this, mediaStream, audioTrack.get(), provider);
// Use the first audio track in the media stream.
RefPtr<MediaStreamTrack> audioTrack = audioTracks[0];
OwnPtr<AudioSourceProvider> provider = audioTrack->createWebAudioSource();
RefPtr<MediaStreamAudioSourceNode> node = MediaStreamAudioSourceNode::create(this, mediaStream, audioTrack.get(), provider.release());
// FIXME: Only stereo streams are supported right now. We should be able to accept multi-channel streams.
node->setFormat(2, sampleRate());
......
......@@ -35,12 +35,12 @@
namespace WebCore {
PassRefPtr<MediaStreamAudioSourceNode> MediaStreamAudioSourceNode::create(AudioContext* context, MediaStream* mediaStream, MediaStreamTrack* audioTrack, AudioSourceProvider* audioSourceProvider)
PassRefPtr<MediaStreamAudioSourceNode> MediaStreamAudioSourceNode::create(AudioContext* context, MediaStream* mediaStream, MediaStreamTrack* audioTrack, PassOwnPtr<AudioSourceProvider> audioSourceProvider)
{
return adoptRef(new MediaStreamAudioSourceNode(context, mediaStream, audioTrack, audioSourceProvider));
}
MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(AudioContext* context, MediaStream* mediaStream, MediaStreamTrack* audioTrack, AudioSourceProvider* audioSourceProvider)
MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(AudioContext* context, MediaStream* mediaStream, MediaStreamTrack* audioTrack, PassOwnPtr<AudioSourceProvider> audioSourceProvider)
: AudioSourceNode(context, context->sampleRate())
, m_mediaStream(mediaStream)
, m_audioTrack(audioTrack)
......
......@@ -41,7 +41,7 @@ class AudioContext;
class MediaStreamAudioSourceNode FINAL : public AudioSourceNode, public AudioSourceProviderClient {
public:
static PassRefPtr<MediaStreamAudioSourceNode> create(AudioContext*, MediaStream*, MediaStreamTrack*, AudioSourceProvider*);
static PassRefPtr<MediaStreamAudioSourceNode> create(AudioContext*, MediaStream*, MediaStreamTrack*, PassOwnPtr<AudioSourceProvider>);
virtual ~MediaStreamAudioSourceNode();
......@@ -53,17 +53,17 @@ public:
// AudioSourceProviderClient
virtual void setFormat(size_t numberOfChannels, float sampleRate) OVERRIDE;
AudioSourceProvider* audioSourceProvider() const { return m_audioSourceProvider; }
AudioSourceProvider* audioSourceProvider() const { return m_audioSourceProvider.get(); }
private:
MediaStreamAudioSourceNode(AudioContext*, MediaStream*, MediaStreamTrack*, AudioSourceProvider*);
MediaStreamAudioSourceNode(AudioContext*, MediaStream*, MediaStreamTrack*, PassOwnPtr<AudioSourceProvider>);
// As an audio source, we will never propagate silence.
virtual bool propagatesSilence() const OVERRIDE { return false; }
RefPtr<MediaStream> m_mediaStream;
RefPtr<MediaStreamTrack> m_audioTrack;
AudioSourceProvider* m_audioSourceProvider;
OwnPtr<AudioSourceProvider> m_audioSourceProvider;
Mutex m_processLock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment