mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
41a1e70799
This is a mega-patch that was too hard to disentangle. Here's what it does: -- Create infrastructure around AudioNode::UpdateOutputEnded to detect when a node can no longer produce any output. When that becomes true, disconnect it from the AudioNode graph. -- Have AudioNode implement JSBindingFinalized to use as input in UpdateOutputEnded. -- Give every AudioNode a MediaStream, and give every connection a MediaInputPort. -- Actually play the audio that reaches the AudioContext's destination node. -- Force AudioContext to use the audio sample rate defined by MediaStreamGraph. -- Fix AudioBufferSourceNode's start and stop methods to possibly throw and take default 'when' parameters. -- Create an AudioNodeStream for AudioBufferSourceNode and give it a AudioBufferSourceNodeEngine that does what's needed. Set parameters for this engine in the start() and stop() methods. -- Create AudioBuffer::GetThreadSharedChannelsForRate, which is responsible for stealing the contents of any JS array buffers, and bundling them up into a thread-shared read-only buffer object which can be used as part of an AudioChunk. This method will also be responsible for resampling and caching as necessary.
66 lines
1.6 KiB
C++
66 lines
1.6 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef AudioBufferSourceNode_h_
|
|
#define AudioBufferSourceNode_h_
|
|
|
|
#include "AudioSourceNode.h"
|
|
#include "AudioBuffer.h"
|
|
#include "mozilla/dom/BindingUtils.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
class AudioBufferSourceNode : public AudioSourceNode,
|
|
public MainThreadMediaStreamListener
|
|
{
|
|
public:
|
|
explicit AudioBufferSourceNode(AudioContext* aContext);
|
|
virtual ~AudioBufferSourceNode();
|
|
|
|
virtual void DestroyMediaStream() MOZ_OVERRIDE
|
|
{
|
|
if (mStream) {
|
|
mStream->RemoveMainThreadListener(this);
|
|
}
|
|
AudioSourceNode::DestroyMediaStream();
|
|
}
|
|
virtual bool SupportsMediaStreams() const MOZ_OVERRIDE
|
|
{
|
|
return true;
|
|
}
|
|
|
|
NS_DECL_ISUPPORTS_INHERITED
|
|
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioBufferSourceNode, AudioSourceNode)
|
|
|
|
virtual JSObject* WrapObject(JSContext* aCx, JSObject* aScope);
|
|
|
|
void Start(JSContext* aCx, double aWhen, double aOffset,
|
|
const Optional<double>& aDuration, ErrorResult& aRv);
|
|
void Stop(double aWhen, ErrorResult& aRv);
|
|
|
|
AudioBuffer* GetBuffer() const
|
|
{
|
|
return mBuffer;
|
|
}
|
|
void SetBuffer(AudioBuffer* aBuffer)
|
|
{
|
|
mBuffer = aBuffer;
|
|
}
|
|
|
|
virtual void NotifyMainThreadStateChanged() MOZ_OVERRIDE;
|
|
|
|
private:
|
|
nsRefPtr<AudioBuffer> mBuffer;
|
|
bool mStartCalled;
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|