Index: Source/modules/webaudio/AudioBuffer.cpp |
diff --git a/Source/modules/webaudio/AudioBuffer.cpp b/Source/modules/webaudio/AudioBuffer.cpp |
index 52a18a3b88044e44d0aca021b10e884760f352db..70680bff6bd080ca25c9ca8206eca73c3fdfdab2 100644 |
--- a/Source/modules/webaudio/AudioBuffer.cpp |
+++ b/Source/modules/webaudio/AudioBuffer.cpp |
@@ -32,6 +32,7 @@ |
#include "modules/webaudio/AudioBuffer.h" |
+#include "bindings/v8/ExceptionMessages.h" |
#include "bindings/v8/ExceptionState.h" |
#include "core/dom/ExceptionCode.h" |
#include "platform/audio/AudioBus.h" |
@@ -54,7 +55,7 @@ float AudioBuffer::maxAllowedSampleRate() |
PassRefPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) |
{ |
- if (sampleRate < minAllowedSampleRate() || sampleRate > maxAllowedSampleRate() || numberOfChannels > AudioContext::maxNumberOfChannels() || !numberOfFrames) |
+ if (sampleRate < minAllowedSampleRate() || sampleRate > maxAllowedSampleRate() || numberOfChannels > AudioContext::maxNumberOfChannels() || !numberOfChannels || !numberOfFrames) |
return nullptr; |
RefPtr<AudioBuffer> buffer = adoptRef(new AudioBuffer(numberOfChannels, numberOfFrames, sampleRate)); |
@@ -64,6 +65,59 @@ PassRefPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t nu |
return buffer; |
} |
+PassRefPtr<AudioBuffer> AudioBuffer::create(unsigned numberOfChannels, size_t numberOfFrames, float sampleRate, ExceptionState& exceptionState) |
+{ |
+ if (!numberOfChannels || numberOfChannels > AudioContext::maxNumberOfChannels()) { |
+ exceptionState.throwDOMException( |
+ NotSupportedError, |
+ ExceptionMessages::indexOutsideRange( |
+ "number of channels", |
+ numberOfChannels, |
+ 1u, |
+ ExceptionMessages::InclusiveBound, |
+ AudioContext::maxNumberOfChannels(), |
+ ExceptionMessages::InclusiveBound)); |
+ return nullptr; |
+ } |
+ |
+ if (sampleRate < AudioBuffer::minAllowedSampleRate() || sampleRate > AudioBuffer::maxAllowedSampleRate()) { |
+ exceptionState.throwDOMException( |
+ NotSupportedError, |
+ ExceptionMessages::indexOutsideRange( |
+ "sample rate", |
+ sampleRate, |
+ AudioBuffer::minAllowedSampleRate(), |
+ ExceptionMessages::InclusiveBound, |
+ AudioBuffer::maxAllowedSampleRate(), |
+ ExceptionMessages::InclusiveBound)); |
+ return nullptr; |
+ } |
+ |
+ if (!numberOfFrames) { |
+ exceptionState.throwDOMException( |
+ NotSupportedError, |
+ ExceptionMessages::indexExceedsMinimumBound( |
+ "number of frames", |
+ numberOfFrames, |
+ static_cast<size_t>(0))); |
+ return nullptr; |
+ } |
+ |
+ RefPtr<AudioBuffer> audioBuffer = create(numberOfChannels, numberOfFrames, sampleRate); |
+ |
+ if (!audioBuffer.get()) { |
+ exceptionState.throwDOMException( |
+ NotSupportedError, |
+ "createBuffer(" |
+ + String::number(numberOfChannels) + ", " |
+ + String::number(numberOfFrames) + ", " |
+ + String::number(sampleRate) |
+ + ") failed."); |
+ } |
+ |
+ return audioBuffer; |
+} |
+ |
PassRefPtr<AudioBuffer> AudioBuffer::createFromAudioFileData(const void* data, size_t dataSize, bool mixToMono, float sampleRate) |
{ |
RefPtr<AudioBus> bus = createBusFromInMemoryAudioFile(data, dataSize, mixToMono, sampleRate); |