#include "bindings/core/v8/ExceptionMessages.h"
#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/custom/V8ArrayBufferCustom.h"
#include "core/dom/ExceptionCode.h"
+#include "modules/webaudio/AudioContext.h"
#include "platform/audio/AudioBus.h"
#include "platform/audio/AudioFileReader.h"
-#include "modules/webaudio/AudioContext.h"
+#include "platform/audio/AudioUtilities.h"
namespace blink {
-float AudioBuffer::minAllowedSampleRate()
+AudioBuffer* AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate)
{
- // crbug.com/344375
- return 3000;
-}
-
-float AudioBuffer::maxAllowedSampleRate()
-{
- // Windows can support up to this rate.
- return 192000;
-}
-
-PassRefPtrWillBeRawPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate)
-{
- if (sampleRate < minAllowedSampleRate() || sampleRate > maxAllowedSampleRate() || numberOfChannels > AudioContext::maxNumberOfChannels() || !numberOfChannels || !numberOfFrames)
- return nullptr;
+ if (!AudioUtilities::isValidAudioBufferSampleRate(sampleRate) || numberOfChannels > AudioContext::maxNumberOfChannels() || !numberOfChannels || !numberOfFrames)
+ return 0;
- RefPtrWillBeRawPtr<AudioBuffer> buffer = adoptRefWillBeNoop(new AudioBuffer(numberOfChannels, numberOfFrames, sampleRate));
+ AudioBuffer* buffer = new AudioBuffer(numberOfChannels, numberOfFrames, sampleRate);
if (!buffer->createdSuccessfully(numberOfChannels))
- return nullptr;
+ return 0;
return buffer;
}
-PassRefPtrWillBeRawPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate, ExceptionState& exceptionState)
+AudioBuffer* AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate, ExceptionState& exceptionState)
{
if (!numberOfChannels || numberOfChannels > AudioContext::maxNumberOfChannels()) {
exceptionState.throwDOMException(
ExceptionMessages::InclusiveBound,
AudioContext::maxNumberOfChannels(),
ExceptionMessages::InclusiveBound));
- return nullptr;
+ return 0;
}
- if (sampleRate < AudioBuffer::minAllowedSampleRate() || sampleRate > AudioBuffer::maxAllowedSampleRate()) {
+ if (!AudioUtilities::isValidAudioBufferSampleRate(sampleRate)) {
exceptionState.throwDOMException(
NotSupportedError,
ExceptionMessages::indexOutsideRange(
"sample rate",
sampleRate,
- AudioBuffer::minAllowedSampleRate(),
+ AudioUtilities::minAudioBufferSampleRate(),
ExceptionMessages::InclusiveBound,
- AudioBuffer::maxAllowedSampleRate(),
+ AudioUtilities::maxAudioBufferSampleRate(),
ExceptionMessages::InclusiveBound));
- return nullptr;
+ return 0;
}
if (!numberOfFrames) {
"number of frames",
numberOfFrames,
static_cast<size_t>(0)));
- return nullptr;
+ return 0;
}
- RefPtrWillBeRawPtr<AudioBuffer> audioBuffer = create(numberOfChannels, numberOfFrames, sampleRate);
+ AudioBuffer* audioBuffer = create(numberOfChannels, numberOfFrames, sampleRate);
- if (!audioBuffer.get()) {
+ if (!audioBuffer) {
exceptionState.throwDOMException(
NotSupportedError,
"createBuffer("
return audioBuffer;
}
-PassRefPtrWillBeRawPtr<AudioBuffer> AudioBuffer::createFromAudioFileData(const void* data, size_t dataSize, bool mixToMono, float sampleRate)
+AudioBuffer* AudioBuffer::createFromAudioFileData(const void* data, size_t dataSize, bool mixToMono, float sampleRate)
{
RefPtr<AudioBus> bus = createBusFromInMemoryAudioFile(data, dataSize, mixToMono, sampleRate);
if (bus.get()) {
- RefPtrWillBeRawPtr<AudioBuffer> buffer = adoptRefWillBeNoop(new AudioBuffer(bus.get()));
+ AudioBuffer* buffer = new AudioBuffer(bus.get());
if (buffer->createdSuccessfully(bus->numberOfChannels()))
return buffer;
}
- return nullptr;
+ return 0;
}
-PassRefPtrWillBeRawPtr<AudioBuffer> AudioBuffer::createFromAudioBus(AudioBus* bus)
+AudioBuffer* AudioBuffer::createFromAudioBus(AudioBus* bus)
{
if (!bus)
- return nullptr;
- RefPtrWillBeRawPtr<AudioBuffer> buffer = adoptRefWillBeNoop(new AudioBuffer(bus));
+ return 0;
+ AudioBuffer* buffer = new AudioBuffer(bus);
if (buffer->createdSuccessfully(bus->numberOfChannels()))
return buffer;
- return nullptr;
+ return 0;
}
bool AudioBuffer::createdSuccessfully(unsigned desiredNumberOfChannels) const
: m_sampleRate(sampleRate)
, m_length(numberOfFrames)
{
- ScriptWrappable::init(this);
m_channels.reserveCapacity(numberOfChannels);
for (unsigned i = 0; i < numberOfChannels; ++i) {
: m_sampleRate(bus->sampleRate())
, m_length(bus->length())
{
- ScriptWrappable::init(this);
// Copy audio data from the bus to the Float32Arrays we manage.
unsigned numberOfChannels = bus->numberOfChannels();
m_channels.reserveCapacity(numberOfChannels);
}
}
+v8::Handle<v8::Object> AudioBuffer::associateWithWrapper(const WrapperTypeInfo* wrapperType, v8::Handle<v8::Object> wrapper, v8::Isolate* isolate)
+{
+ ScriptWrappable::associateWithWrapper(wrapperType, wrapper, isolate);
+
+ if (!wrapper.IsEmpty()) {
+ // We only setDeallocationObservers on array buffers that are held by
+ // some object in the V8 heap, not in the ArrayBuffer constructor
+ // itself. This is because V8 GC only cares about memory it can free on
+ // GC, and until the object is exposed to JavaScript, V8 GC doesn't
+ // affect it.
+ for (unsigned i = 0, n = numberOfChannels(); i < n; ++i) {
+ getChannelData(i)->buffer()->setDeallocationObserver(V8ArrayBufferDeallocationObserver::instanceTemplate());
+ }
+ }
+ return wrapper;
+}
+
} // namespace blink
#endif // ENABLE(WEB_AUDIO)