mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
697bec41a5
This is the full implementation of the AudioBuffer object. There are two ways to create these objects from an audio context and this patch implements only one of them. The construction of the AudioBuffer object is a two step process: the object should be created with operator new first, and then InitializeBuffers should be called on it. InitializeBuffers is fallible, because it uses the JS API to create the underlying typed arrays, but that's fine, since the length of the buffers comes from web content, and we don't want to use infallible allocations for those anyways. We hold on to the JS objects from the C++ implementation, and trace through all of those objects, so that a GC does not kill those object without us knowing. The buffer should be possible to manipulate from both C++ and JS, and the C++ object probably needs to support a set of methods for the C++ callers at some point.
83 lines
2.3 KiB
C++
83 lines
2.3 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/. */
|
|
|
|
#include "AudioContext.h"
|
|
#include "nsContentUtils.h"
|
|
#include "nsIDOMWindow.h"
|
|
#include "mozilla/ErrorResult.h"
|
|
#include "mozilla/dom/AudioContextBinding.h"
|
|
#include "AudioDestinationNode.h"
|
|
#include "AudioBufferSourceNode.h"
|
|
#include "AudioBuffer.h"
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_2(AudioContext, mWindow, mDestination)
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(AudioContext)
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE(AudioContext)
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AudioContext)
|
|
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
|
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
|
NS_INTERFACE_MAP_END
|
|
|
|
AudioContext::AudioContext(nsIDOMWindow* aWindow)
|
|
: mWindow(aWindow)
|
|
, mDestination(new AudioDestinationNode(this))
|
|
{
|
|
SetIsDOMBinding();
|
|
}
|
|
|
|
AudioContext::~AudioContext()
|
|
{
|
|
}
|
|
|
|
JSObject*
|
|
AudioContext::WrapObject(JSContext* aCx, JSObject* aScope,
|
|
bool* aTriedToWrap)
|
|
{
|
|
return mozAudioContextBinding::Wrap(aCx, aScope, this, aTriedToWrap);
|
|
}
|
|
|
|
/* static */ already_AddRefed<AudioContext>
|
|
AudioContext::Constructor(nsISupports* aGlobal, ErrorResult& aRv)
|
|
{
|
|
nsCOMPtr<nsIDOMWindow> window = do_QueryInterface(aGlobal);
|
|
if (!window) {
|
|
aRv.Throw(NS_ERROR_FAILURE);
|
|
return nullptr;
|
|
}
|
|
|
|
AudioContext* object = new AudioContext(window);
|
|
NS_ADDREF(object);
|
|
return object;
|
|
}
|
|
|
|
already_AddRefed<AudioBufferSourceNode>
|
|
AudioContext::CreateBufferSource()
|
|
{
|
|
nsRefPtr<AudioBufferSourceNode> bufferNode =
|
|
new AudioBufferSourceNode(this);
|
|
return bufferNode.forget();
|
|
}
|
|
|
|
already_AddRefed<AudioBuffer>
|
|
AudioContext::CreateBuffer(JSContext* aJSContext, uint32_t aNumberOfChannels,
|
|
uint32_t aLength, float aSampleRate,
|
|
ErrorResult& aRv)
|
|
{
|
|
nsRefPtr<AudioBuffer> buffer = new AudioBuffer(this, aLength, aSampleRate);
|
|
if (!buffer->InitializeBuffers(aNumberOfChannels, aJSContext)) {
|
|
aRv.Throw(NS_ERROR_OUT_OF_MEMORY);
|
|
return nullptr;
|
|
}
|
|
return buffer.forget();
|
|
}
|
|
|
|
}
|
|
}
|
|
|