bug 1197043 move AudioNodeStream creation to stream class r=padenot

--HG--
extra : rebase_source : 2e399f5d59b057a0cca6a423481ac86f6fa2c507
This commit is contained in:
Karl Tomlinson 2015-08-12 11:26:24 +12:00
Родитель 4415ffebb7
Коммит 330a9459ea
25 изменённых файлов: 103 добавлений и 83 удалений

Просмотреть файл

@ -776,8 +776,8 @@ MediaRecorder::MediaRecorder(AudioNode& aSrcAudioNode,
if (aSrcAudioNode.NumberOfOutputs() > 0) {
AudioContext* ctx = aSrcAudioNode.Context();
AudioNodeEngine* engine = new AudioNodeEngine(nullptr);
mPipeStream = ctx->Graph()->CreateAudioNodeStream(engine,
MediaStreamGraph::EXTERNAL_STREAM);
mPipeStream = AudioNodeStream::Create(ctx->Graph(), engine,
AudioNodeStream::EXTERNAL_STREAM);
AudioNodeStream* ns = aSrcAudioNode.GetStream();
if (ns) {
mInputPort = mPipeStream->AllocateInputPort(aSrcAudioNode.GetStream(),

Просмотреть файл

@ -20,7 +20,6 @@
#include "ImageContainer.h"
#include "AudioCaptureStream.h"
#include "AudioChannelService.h"
#include "AudioNodeEngine.h"
#include "AudioNodeStream.h"
#include "AudioNodeExternalInputStream.h"
#include "mozilla/dom/AudioContextBinding.h"
@ -3120,41 +3119,6 @@ MediaStreamGraph::CreateAudioCaptureStream(DOMMediaStream* aWrapper)
return stream;
}
AudioNodeExternalInputStream*
MediaStreamGraph::CreateAudioNodeExternalInputStream(AudioNodeEngine* aEngine)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(GraphRate() == aEngine->NodeMainThread()->Context()->SampleRate());
AudioNodeExternalInputStream* stream = new AudioNodeExternalInputStream(
aEngine, GraphRate(), aEngine->NodeMainThread()->Context()->Id());
AddStream(stream);
return stream;
}
AudioNodeStream*
MediaStreamGraph::CreateAudioNodeStream(AudioNodeEngine* aEngine,
AudioNodeStreamKind aKind)
{
MOZ_ASSERT(NS_IsMainThread());
// MediaRecorders use an AudioNodeStream, but no AudioNode
AudioNode* node = aEngine->NodeMainThread();
MOZ_ASSERT(!node || GraphRate() == node->Context()->SampleRate());
dom::AudioContext::AudioContextId contextIdForStream = node ? node->Context()->Id() :
NO_AUDIO_CONTEXT;
AudioNodeStream* stream = new AudioNodeStream(aEngine, aKind, GraphRate(),
contextIdForStream);
if (aEngine->HasNode()) {
stream->SetChannelMixingParametersImpl(aEngine->NodeMainThread()->ChannelCount(),
aEngine->NodeMainThread()->ChannelCountModeValue(),
aEngine->NodeMainThread()->ChannelInterpretationValue());
}
AddStream(stream);
return stream;
}
void
MediaStreamGraph::AddStream(MediaStream* aStream)
{

Просмотреть файл

@ -1240,19 +1240,7 @@ public:
* Create a stream that will mix all its audio input.
*/
ProcessedMediaStream* CreateAudioCaptureStream(DOMMediaStream* aWrapper);
// Internal AudioNodeStreams can only pass their output to another
// AudioNode, whereas external AudioNodeStreams can pass their output
// to an nsAudioStream for playback.
enum AudioNodeStreamKind { SOURCE_STREAM, INTERNAL_STREAM, EXTERNAL_STREAM };
/**
* Create a stream that will process audio for an AudioNode.
* Takes ownership of aEngine.
*/
AudioNodeStream* CreateAudioNodeStream(AudioNodeEngine* aEngine,
AudioNodeStreamKind aKind);
AudioNodeExternalInputStream*
CreateAudioNodeExternalInputStream(AudioNodeEngine* aEngine);
/**
* Add a new stream to the graph. Main thread.
*/

Просмотреть файл

@ -85,8 +85,9 @@ AnalyserNode::AnalyserNode(AudioContext* aContext)
, mMaxDecibels(-30.)
, mSmoothingTimeConstant(.8)
{
mStream = aContext->Graph()->CreateAudioNodeStream(new AnalyserNodeEngine(this),
MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(),
new AnalyserNodeEngine(this),
AudioNodeStream::INTERNAL_STREAM);
// Enough chunks must be recorded to handle the case of fftSize being
// increased to maximum immediately before getFloatTimeDomainData() is

Просмотреть файл

@ -542,7 +542,8 @@ AudioBufferSourceNode::AudioBufferSourceNode(AudioContext* aContext)
, mStartCalled(false)
{
AudioBufferSourceNodeEngine* engine = new AudioBufferSourceNodeEngine(this, aContext->Destination());
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::SOURCE_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::SOURCE_STREAM);
engine->SetSourceStream(mStream);
mStream->AddMainThreadListener(this);
}

Просмотреть файл

@ -346,7 +346,8 @@ AudioDestinationNode::AudioDestinationNode(AudioContext* aContext,
aLength, aSampleRate) :
static_cast<AudioNodeEngine*>(new DestinationNodeEngine(this));
mStream = graph->CreateAudioNodeStream(engine, MediaStreamGraph::EXTERNAL_STREAM);
mStream = AudioNodeStream::Create(graph, engine,
AudioNodeStream::EXTERNAL_STREAM);
mStream->AddMainThreadListener(this);
mStream->AddAudioOutput(&gWebAudioOutputKey);

Просмотреть файл

@ -13,7 +13,7 @@ using namespace mozilla::dom;
namespace mozilla {
AudioNodeExternalInputStream::AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate, uint32_t aContextId)
: AudioNodeStream(aEngine, MediaStreamGraph::INTERNAL_STREAM, aSampleRate, aContextId)
: AudioNodeStream(aEngine, INTERNAL_STREAM, aSampleRate, aContextId)
{
MOZ_COUNT_CTOR(AudioNodeExternalInputStream);
}
@ -23,6 +23,20 @@ AudioNodeExternalInputStream::~AudioNodeExternalInputStream()
MOZ_COUNT_DTOR(AudioNodeExternalInputStream);
}
/* static */ already_AddRefed<AudioNodeExternalInputStream>
AudioNodeExternalInputStream::Create(MediaStreamGraph* aGraph,
AudioNodeEngine* aEngine)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aGraph->GraphRate() == aEngine->NodeMainThread()->Context()->SampleRate());
nsRefPtr<AudioNodeExternalInputStream> stream =
new AudioNodeExternalInputStream(aEngine, aGraph->GraphRate(),
aEngine->NodeMainThread()->Context()->Id());
aGraph->AddStream(stream);
return stream.forget();
}
/**
* Copies the data in aInput to aOffsetInBlock within aBlock.
* aBlock must have been allocated with AllocateInputBlock and have a channel

Просмотреть файл

@ -21,9 +21,12 @@ namespace mozilla {
class AudioNodeExternalInputStream final : public AudioNodeStream
{
public:
static already_AddRefed<AudioNodeExternalInputStream>
Create(MediaStreamGraph* aGraph, AudioNodeEngine* aEngine);
protected:
AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate,
uint32_t aContextId);
protected:
~AudioNodeExternalInputStream();
public:

Просмотреть файл

@ -26,7 +26,7 @@ namespace mozilla {
*/
AudioNodeStream::AudioNodeStream(AudioNodeEngine* aEngine,
MediaStreamGraph::AudioNodeStreamKind aKind,
AudioNodeStreamKind aKind,
TrackRate aSampleRate,
AudioContext::AudioContextId aContextId)
: ProcessedMediaStream(nullptr),
@ -53,6 +53,30 @@ AudioNodeStream::~AudioNodeStream()
MOZ_COUNT_DTOR(AudioNodeStream);
}
/* static */ already_AddRefed<AudioNodeStream>
AudioNodeStream::Create(MediaStreamGraph* aGraph, AudioNodeEngine* aEngine,
AudioNodeStreamKind aKind)
{
MOZ_ASSERT(NS_IsMainThread());
// MediaRecorders use an AudioNodeStream, but no AudioNode
AudioNode* node = aEngine->NodeMainThread();
MOZ_ASSERT(!node || aGraph->GraphRate() == node->Context()->SampleRate());
dom::AudioContext::AudioContextId contextIdForStream = node ? node->Context()->Id() :
NO_AUDIO_CONTEXT;
nsRefPtr<AudioNodeStream> stream =
new AudioNodeStream(aEngine, aKind, aGraph->GraphRate(),
contextIdForStream);
if (aEngine->HasNode()) {
stream->SetChannelMixingParametersImpl(aEngine->NodeMainThread()->ChannelCount(),
aEngine->NodeMainThread()->ChannelCountModeValue(),
aEngine->NodeMainThread()->ChannelInterpretationValue());
}
aGraph->AddStream(stream);
return stream.forget();
}
size_t
AudioNodeStream::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
{
@ -571,7 +595,7 @@ AudioNodeStream::AdvanceOutputSegment()
StreamBuffer::Track* track = EnsureTrack(AUDIO_TRACK);
AudioSegment* segment = track->Get<AudioSegment>();
if (mKind == MediaStreamGraph::EXTERNAL_STREAM) {
if (mKind == EXTERNAL_STREAM) {
segment->AppendAndConsumeChunk(&mLastChunks[0]);
} else {
segment->AppendNullData(mLastChunks[0].GetDuration());

Просмотреть файл

@ -43,15 +43,27 @@ public:
typedef nsAutoTArray<AudioChunk, 1> OutputChunks;
// Internal AudioNodeStreams can only pass their output to another
// AudioNode, whereas external AudioNodeStreams can pass their output
// to an nsAudioStream for playback.
enum AudioNodeStreamKind { SOURCE_STREAM, INTERNAL_STREAM, EXTERNAL_STREAM };
/**
* Create a stream that will process audio for an AudioNode.
* Takes ownership of aEngine.
*/
static already_AddRefed<AudioNodeStream>
Create(MediaStreamGraph* aGraph, AudioNodeEngine* aEngine,
AudioNodeStreamKind aKind);
protected:
/**
* Transfers ownership of aEngine to the new AudioNodeStream.
*/
AudioNodeStream(AudioNodeEngine* aEngine,
MediaStreamGraph::AudioNodeStreamKind aKind,
AudioNodeStreamKind aKind,
TrackRate aSampleRate,
AudioContext::AudioContextId aContextId);
protected:
~AudioNodeStream();
public:
@ -112,8 +124,8 @@ public:
virtual bool MainThreadNeedsUpdates() const override
{
// Only source and external streams need updates on the main thread.
return (mKind == MediaStreamGraph::SOURCE_STREAM && mFinished) ||
mKind == MediaStreamGraph::EXTERNAL_STREAM;
return (mKind == SOURCE_STREAM && mFinished) ||
mKind == EXTERNAL_STREAM;
}
virtual bool IsIntrinsicallyConsumed() const override
{
@ -174,7 +186,7 @@ protected:
// AudioContext. It is set on the main thread, in the constructor.
const AudioContext::AudioContextId mAudioContextId;
// Whether this is an internal or external stream
const MediaStreamGraph::AudioNodeStreamKind mKind;
const AudioNodeStreamKind mKind;
// The number of input channels that this stream requires. 0 means don't care.
uint32_t mNumberOfInputChannels;
// The mixing modes

Просмотреть файл

@ -100,8 +100,8 @@ AudioParam::Stream()
AudioNodeEngine* engine = new AudioNodeEngine(nullptr);
nsRefPtr<AudioNodeStream> stream =
mNode->Context()->Graph()->CreateAudioNodeStream(engine,
MediaStreamGraph::INTERNAL_STREAM);
AudioNodeStream::Create(mNode->Context()->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
// Force the input to have only one channel, and make it down-mix using
// the speaker rules if needed.

Просмотреть файл

@ -250,7 +250,8 @@ BiquadFilterNode::BiquadFilterNode(AudioContext* aContext)
, mGain(new AudioParam(this, SendGainToStream, 0.f, "gain"))
{
BiquadFilterNodeEngine* engine = new BiquadFilterNodeEngine(this, aContext->Destination());
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
engine->SetSourceStream(mStream);
}

Просмотреть файл

@ -73,8 +73,9 @@ ChannelMergerNode::ChannelMergerNode(AudioContext* aContext,
ChannelInterpretation::Speakers)
, mInputCount(aInputCount)
{
mStream = aContext->Graph()->CreateAudioNodeStream(new ChannelMergerNodeEngine(this),
MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(),
new ChannelMergerNodeEngine(this),
AudioNodeStream::INTERNAL_STREAM);
}
ChannelMergerNode::~ChannelMergerNode()

Просмотреть файл

@ -60,8 +60,9 @@ ChannelSplitterNode::ChannelSplitterNode(AudioContext* aContext,
ChannelInterpretation::Speakers)
, mOutputCount(aOutputCount)
{
mStream = aContext->Graph()->CreateAudioNodeStream(new ChannelSplitterNodeEngine(this),
MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(),
new ChannelSplitterNodeEngine(this),
AudioNodeStream::INTERNAL_STREAM);
}
ChannelSplitterNode::~ChannelSplitterNode()

Просмотреть файл

@ -191,7 +191,8 @@ ConvolverNode::ConvolverNode(AudioContext* aContext)
, mNormalize(true)
{
ConvolverNodeEngine* engine = new ConvolverNodeEngine(this, mNormalize);
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
}
ConvolverNode::~ConvolverNode()

Просмотреть файл

@ -198,7 +198,8 @@ DelayNode::DelayNode(AudioContext* aContext, double aMaxDelay)
DelayNodeEngine* engine =
new DelayNodeEngine(this, aContext->Destination(),
aContext->SampleRate() * aMaxDelay);
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
engine->SetSourceStream(mStream);
}

Просмотреть файл

@ -203,7 +203,8 @@ DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* aContext)
, mRelease(new AudioParam(this, SendReleaseToStream, 0.25f, "release"))
{
DynamicsCompressorNodeEngine* engine = new DynamicsCompressorNodeEngine(this, aContext->Destination());
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
engine->SetSourceStream(mStream);
}

Просмотреть файл

@ -128,7 +128,8 @@ GainNode::GainNode(AudioContext* aContext)
, mGain(new AudioParam(this, SendGainToStream, 1.0f, "gain"))
{
GainNodeEngine* engine = new GainNodeEngine(this, aContext->Destination());
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
engine->SetSourceStream(mStream);
}

Просмотреть файл

@ -39,7 +39,8 @@ MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(AudioContext* a
ProcessedMediaStream* outputStream = mDOMStream->GetStream()->AsProcessedStream();
MOZ_ASSERT(!!outputStream);
AudioNodeEngine* engine = new AudioNodeEngine(this);
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::EXTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::EXTERNAL_STREAM);
mPort = outputStream->AllocateInputPort(mStream);
nsIDocument* doc = aContext->GetParentObject()->GetExtantDoc();

Просмотреть файл

@ -39,7 +39,7 @@ MediaStreamAudioSourceNode::MediaStreamAudioSourceNode(AudioContext* aContext,
mInputStream(aMediaStream)
{
AudioNodeEngine* engine = new MediaStreamAudioSourceNodeEngine(this);
mStream = aContext->Graph()->CreateAudioNodeExternalInputStream(engine);
mStream = AudioNodeExternalInputStream::Create(aContext->Graph(), engine);
ProcessedMediaStream* outputStream = static_cast<ProcessedMediaStream*>(mStream.get());
mInputPort = outputStream->AllocateInputPort(aMediaStream->GetStream(),
MediaInputPort::FLAG_BLOCK_INPUT);

Просмотреть файл

@ -384,7 +384,8 @@ OscillatorNode::OscillatorNode(AudioContext* aContext)
, mStartCalled(false)
{
OscillatorNodeEngine* engine = new OscillatorNodeEngine(this, aContext->Destination());
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::SOURCE_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::SOURCE_STREAM);
engine->SetSourceStream(mStream);
mStream->AddMainThreadListener(this);
}

Просмотреть файл

@ -240,8 +240,9 @@ PannerNode::PannerNode(AudioContext* aContext)
, mConeOuterAngle(360.)
, mConeOuterGain(0.)
{
mStream = aContext->Graph()->CreateAudioNodeStream(new PannerNodeEngine(this),
MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(),
new PannerNodeEngine(this),
AudioNodeStream::INTERNAL_STREAM);
// We should register once we have set up our stream and engine.
Context()->Listener()->RegisterPannerNode(this);
}

Просмотреть файл

@ -520,7 +520,8 @@ ScriptProcessorNode::ScriptProcessorNode(AudioContext* aContext,
aContext->Destination(),
BufferSize(),
aNumberOfInputChannels);
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
engine->SetSourceStream(mStream);
}

Просмотреть файл

@ -181,8 +181,8 @@ StereoPannerNode::StereoPannerNode(AudioContext* aContext)
, mPan(new AudioParam(this, SendPanToStream, 0.f, "pan"))
{
StereoPannerNodeEngine* engine = new StereoPannerNodeEngine(this, aContext->Destination());
mStream = aContext->Graph()->CreateAudioNodeStream(engine,
MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
engine->SetSourceStream(mStream);
}

Просмотреть файл

@ -288,7 +288,8 @@ WaveShaperNode::WaveShaperNode(AudioContext* aContext)
mozilla::HoldJSObjects(this);
WaveShaperNodeEngine* engine = new WaveShaperNodeEngine(this);
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
mStream = AudioNodeStream::Create(aContext->Graph(), engine,
AudioNodeStream::INTERNAL_STREAM);
}
WaveShaperNode::~WaveShaperNode()