mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 865234 - Part 2: Send the channel mixing information to the AudioNodeStream; r=roc
This commit is contained in:
parent
a749080ffb
commit
9c26dbc68f
@ -216,6 +216,12 @@ public:
|
||||
return mNode;
|
||||
}
|
||||
|
||||
dom::AudioNode* NodeMainThread() const
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
return mNode;
|
||||
}
|
||||
|
||||
void ClearNode()
|
||||
{
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
|
@ -160,6 +160,54 @@ AudioNodeStream::SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList> aB
|
||||
GraphImpl()->AppendMessage(new Message(this, aBuffer));
|
||||
}
|
||||
|
||||
void
|
||||
AudioNodeStream::SetChannelMixingParameters(uint32_t aNumberOfChannels,
|
||||
ChannelCountMode aChannelCountMode,
|
||||
ChannelInterpretation aChannelInterpretation)
|
||||
{
|
||||
class Message : public ControlMessage {
|
||||
public:
|
||||
Message(AudioNodeStream* aStream,
|
||||
uint32_t aNumberOfChannels,
|
||||
ChannelCountMode aChannelCountMode,
|
||||
ChannelInterpretation aChannelInterpretation)
|
||||
: ControlMessage(aStream),
|
||||
mNumberOfChannels(aNumberOfChannels),
|
||||
mChannelCountMode(aChannelCountMode),
|
||||
mChannelInterpretation(aChannelInterpretation)
|
||||
{}
|
||||
virtual void Run()
|
||||
{
|
||||
static_cast<AudioNodeStream*>(mStream)->
|
||||
SetChannelMixingParametersImpl(mNumberOfChannels, mChannelCountMode,
|
||||
mChannelInterpretation);
|
||||
}
|
||||
uint32_t mNumberOfChannels;
|
||||
ChannelCountMode mChannelCountMode;
|
||||
ChannelInterpretation mChannelInterpretation;
|
||||
};
|
||||
|
||||
MOZ_ASSERT(this);
|
||||
GraphImpl()->AppendMessage(new Message(this, aNumberOfChannels,
|
||||
aChannelCountMode,
|
||||
aChannelInterpretation));
|
||||
}
|
||||
|
||||
void
|
||||
AudioNodeStream::SetChannelMixingParametersImpl(uint32_t aNumberOfChannels,
|
||||
ChannelCountMode aChannelCountMode,
|
||||
ChannelInterpretation aChannelInterpretation)
|
||||
{
|
||||
// Make sure that we're not clobbering any significant bits by fitting these
|
||||
// values in 16 bits.
|
||||
MOZ_ASSERT(int(aChannelCountMode) < INT16_MAX);
|
||||
MOZ_ASSERT(int(aChannelInterpretation) < INT16_MAX);
|
||||
|
||||
mNumberOfInputChannels = aNumberOfChannels;
|
||||
mMixingMode.mChannelCountMode = aChannelCountMode;
|
||||
mMixingMode.mChannelInterpretation = aChannelInterpretation;
|
||||
}
|
||||
|
||||
StreamBuffer::Track*
|
||||
AudioNodeStream::EnsureTrack()
|
||||
{
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "MediaStreamGraph.h"
|
||||
#include "AudioChannelFormat.h"
|
||||
#include "AudioNodeEngine.h"
|
||||
#include "mozilla/dom/AudioNodeBinding.h"
|
||||
#include "mozilla/dom/AudioParam.h"
|
||||
|
||||
#ifdef PR_LOGGING
|
||||
@ -43,13 +44,14 @@ public:
|
||||
* Transfers ownership of aEngine to the new AudioNodeStream.
|
||||
*/
|
||||
AudioNodeStream(AudioNodeEngine* aEngine,
|
||||
MediaStreamGraph::AudioNodeStreamKind aKind,
|
||||
uint32_t aNumberOfInputChannels = 0)
|
||||
MediaStreamGraph::AudioNodeStreamKind aKind)
|
||||
: ProcessedMediaStream(nullptr),
|
||||
mEngine(aEngine),
|
||||
mKind(aKind),
|
||||
mNumberOfInputChannels(aNumberOfInputChannels)
|
||||
mNumberOfInputChannels(2)
|
||||
{
|
||||
mMixingMode.mChannelCountMode = dom::ChannelCountMode::Max;
|
||||
mMixingMode.mChannelInterpretation = dom::ChannelInterpretation::Speakers;
|
||||
// AudioNodes are always producing data
|
||||
mHasCurrentData = true;
|
||||
MOZ_COUNT_CTOR(AudioNodeStream);
|
||||
@ -68,12 +70,18 @@ public:
|
||||
void SetTimelineParameter(uint32_t aIndex, const dom::AudioParamTimeline& aValue);
|
||||
void SetThreeDPointParameter(uint32_t aIndex, const dom::ThreeDPoint& aValue);
|
||||
void SetBuffer(already_AddRefed<ThreadSharedFloatArrayBufferList> aBuffer);
|
||||
void SetChannelMixingParameters(uint32_t aNumberOfChannels,
|
||||
dom::ChannelCountMode aChannelCountMoe,
|
||||
dom::ChannelInterpretation aChannelInterpretation);
|
||||
|
||||
virtual AudioNodeStream* AsAudioNodeStream() { return this; }
|
||||
|
||||
// Graph thread only
|
||||
void SetStreamTimeParameterImpl(uint32_t aIndex, MediaStream* aRelativeToStream,
|
||||
double aStreamTime);
|
||||
void SetChannelMixingParametersImpl(uint32_t aNumberOfChannels,
|
||||
dom::ChannelCountMode aChannelCountMoe,
|
||||
dom::ChannelInterpretation aChannelInterpretation);
|
||||
virtual void ProduceOutput(GraphTime aFrom, GraphTime aTo);
|
||||
TrackTicks GetCurrentPosition();
|
||||
bool AllInputsFinished() const;
|
||||
@ -95,6 +103,11 @@ protected:
|
||||
MediaStreamGraph::AudioNodeStreamKind mKind;
|
||||
// The number of input channels that this stream requires. 0 means don't care.
|
||||
uint32_t mNumberOfInputChannels;
|
||||
// The mixing modes
|
||||
struct {
|
||||
dom::ChannelCountMode mChannelCountMode : 16;
|
||||
dom::ChannelInterpretation mChannelInterpretation : 16;
|
||||
} mMixingMode;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -2010,13 +2010,16 @@ MediaStreamGraph::CreateTrackUnionStream(DOMMediaStream* aWrapper)
|
||||
|
||||
AudioNodeStream*
|
||||
MediaStreamGraph::CreateAudioNodeStream(AudioNodeEngine* aEngine,
|
||||
AudioNodeStreamKind aKind,
|
||||
uint32_t aNumberOfInputChannels)
|
||||
AudioNodeStreamKind aKind)
|
||||
{
|
||||
AudioNodeStream* stream = new AudioNodeStream(aEngine, aKind, aNumberOfInputChannels);
|
||||
MOZ_ASSERT(NS_IsMainThread());
|
||||
AudioNodeStream* stream = new AudioNodeStream(aEngine, aKind);
|
||||
NS_ADDREF(stream);
|
||||
MediaStreamGraphImpl* graph = static_cast<MediaStreamGraphImpl*>(this);
|
||||
stream->SetGraphImpl(graph);
|
||||
stream->SetChannelMixingParametersImpl(aEngine->NodeMainThread()->ChannelCount(),
|
||||
aEngine->NodeMainThread()->ChannelCountModeValue(),
|
||||
aEngine->NodeMainThread()->ChannelInterpretationValue());
|
||||
graph->AppendMessage(new CreateMessage(stream));
|
||||
return stream;
|
||||
}
|
||||
|
@ -909,8 +909,7 @@ public:
|
||||
* Takes ownership of aEngine.
|
||||
*/
|
||||
AudioNodeStream* CreateAudioNodeStream(AudioNodeEngine* aEngine,
|
||||
AudioNodeStreamKind aKind,
|
||||
uint32_t aNumberOfInputChannels = 0);
|
||||
AudioNodeStreamKind aKind);
|
||||
/**
|
||||
* Returns the number of graph updates sent. This can be used to track
|
||||
* whether a given update has been processed by the graph thread and reflected
|
||||
|
@ -183,6 +183,15 @@ AudioNode::SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint&
|
||||
ns->SetThreeDPointParameter(aIndex, aValue);
|
||||
}
|
||||
|
||||
void
|
||||
AudioNode::SendChannelMixingParametersToStream()
|
||||
{
|
||||
AudioNodeStream* ns = static_cast<AudioNodeStream*>(mStream.get());
|
||||
MOZ_ASSERT(ns, "How come we don't have a stream here?");
|
||||
ns->SetChannelMixingParameters(mChannelCount, mChannelCountMode,
|
||||
mChannelInterpretation);
|
||||
}
|
||||
|
||||
void
|
||||
AudioNode::SendTimelineParameterToStream(AudioNode* aNode, uint32_t aIndex,
|
||||
const AudioParamTimeline& aValue)
|
||||
|
@ -127,6 +127,7 @@ public:
|
||||
void SetChannelCount(uint32_t aChannelCount)
|
||||
{
|
||||
mChannelCount = aChannelCount;
|
||||
SendChannelMixingParametersToStream();
|
||||
}
|
||||
ChannelCountMode ChannelCountModeValue() const
|
||||
{
|
||||
@ -135,6 +136,7 @@ public:
|
||||
void SetChannelCountModeValue(ChannelCountMode aMode)
|
||||
{
|
||||
mChannelCountMode = aMode;
|
||||
SendChannelMixingParametersToStream();
|
||||
}
|
||||
ChannelInterpretation ChannelInterpretationValue() const
|
||||
{
|
||||
@ -143,6 +145,7 @@ public:
|
||||
void SetChannelInterpretationValue(ChannelInterpretation aMode)
|
||||
{
|
||||
mChannelInterpretation = aMode;
|
||||
SendChannelMixingParametersToStream();
|
||||
}
|
||||
|
||||
struct InputNode {
|
||||
@ -180,6 +183,7 @@ protected:
|
||||
void SendDoubleParameterToStream(uint32_t aIndex, double aValue);
|
||||
void SendInt32ParameterToStream(uint32_t aIndex, int32_t aValue);
|
||||
void SendThreeDPointParameterToStream(uint32_t aIndex, const ThreeDPoint& aValue);
|
||||
void SendChannelMixingParametersToStream();
|
||||
static void SendTimelineParameterToStream(AudioNode* aNode, uint32_t aIndex,
|
||||
const AudioParamTimeline& aValue);
|
||||
|
||||
|
@ -178,7 +178,7 @@ private:
|
||||
|
||||
DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* aContext)
|
||||
: AudioNode(aContext,
|
||||
2,
|
||||
DEFAULT_NUMBER_OF_CHANNELS,
|
||||
ChannelCountMode::Explicit,
|
||||
ChannelInterpretation::Speakers)
|
||||
, mThreshold(new AudioParam(this, SendThresholdToStream, -24.f))
|
||||
@ -189,8 +189,7 @@ DynamicsCompressorNode::DynamicsCompressorNode(AudioContext* aContext)
|
||||
, mRelease(new AudioParam(this, SendReleaseToStream, 0.25f))
|
||||
{
|
||||
DynamicsCompressorNodeEngine* engine = new DynamicsCompressorNodeEngine(this, aContext->Destination());
|
||||
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM,
|
||||
DEFAULT_NUMBER_OF_CHANNELS);
|
||||
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
|
||||
engine->SetSourceStream(static_cast<AudioNodeStream*> (mStream.get()));
|
||||
}
|
||||
|
||||
|
@ -360,9 +360,9 @@ ScriptProcessorNode::ScriptProcessorNode(AudioContext* aContext,
|
||||
uint32_t aNumberOfInputChannels,
|
||||
uint32_t aNumberOfOutputChannels)
|
||||
: AudioNode(aContext,
|
||||
2,
|
||||
ChannelCountMode::Explicit,
|
||||
ChannelInterpretation::Speakers)
|
||||
aNumberOfInputChannels,
|
||||
mozilla::dom::ChannelCountMode::Explicit,
|
||||
mozilla::dom::ChannelInterpretation::Speakers)
|
||||
, mSharedBuffers(new SharedBuffers())
|
||||
, mBufferSize(aBufferSize ?
|
||||
aBufferSize : // respect what the web developer requested
|
||||
@ -375,8 +375,7 @@ ScriptProcessorNode::ScriptProcessorNode(AudioContext* aContext,
|
||||
aContext->Destination(),
|
||||
BufferSize(),
|
||||
aNumberOfInputChannels);
|
||||
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM,
|
||||
aNumberOfInputChannels);
|
||||
mStream = aContext->Graph()->CreateAudioNodeStream(engine, MediaStreamGraph::INTERNAL_STREAM);
|
||||
engine->SetSourceStream(static_cast<AudioNodeStream*> (mStream.get()));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user