summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/bindings/js/JSAudioContextCustom.cpp')
-rw-r--r--Source/WebCore/bindings/js/JSAudioContextCustom.cpp51
1 files changed, 49 insertions, 2 deletions
diff --git a/Source/WebCore/bindings/js/JSAudioContextCustom.cpp b/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
index 04644bc..382d0cb 100644
--- a/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
+++ b/Source/WebCore/bindings/js/JSAudioContextCustom.cpp
@@ -28,12 +28,18 @@
#include "AudioContext.h"
+#include "ArrayBuffer.h"
+#include "AudioBuffer.h"
+#include "JSArrayBuffer.h"
+#include "JSAudioBuffer.h"
#include "JSAudioContext.h"
#include <runtime/Error.h>
+using namespace JSC;
+
namespace WebCore {
-JSC::EncodedJSValue JSC_HOST_CALL JSAudioContextConstructor::constructJSAudioContext(JSC::ExecState* exec)
+EncodedJSValue JSC_HOST_CALL JSAudioContextConstructor::constructJSAudioContext(ExecState* exec)
{
JSAudioContextConstructor* jsConstructor = static_cast<JSAudioContextConstructor*>(exec->callee());
if (!jsConstructor)
@@ -49,7 +55,48 @@ JSC::EncodedJSValue JSC_HOST_CALL JSAudioContextConstructor::constructJSAudioCon
Document* document = static_cast<Document*>(scriptExecutionContext);
RefPtr<AudioContext> context = AudioContext::create(document);
- return JSC::JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), context.get())));
+ return JSValue::encode(asObject(toJS(exec, jsConstructor->globalObject(), context.get())));
+}
+
+JSValue JSAudioContext::createBuffer(ExecState* exec)
+{
+ if (exec->argumentCount() < 2)
+ return throwError(exec, createSyntaxError(exec, "Not enough arguments"));
+
+ AudioContext* audioContext = static_cast<AudioContext*>(impl());
+ ASSERT(audioContext);
+
+ // AudioBuffer createBuffer(in ArrayBuffer buffer, in boolean mixToMono);
+ JSValue val = exec->argument(0);
+ if (val.inherits(&JSArrayBuffer::s_info)) {
+ ArrayBuffer* arrayBuffer = toArrayBuffer(val);
+ ASSERT(arrayBuffer);
+ if (arrayBuffer) {
+ bool mixToMono = exec->argument(1).toBoolean(exec);
+
+ RefPtr<AudioBuffer> audioBuffer = audioContext->createBuffer(arrayBuffer, mixToMono);
+ if (!audioBuffer.get())
+ return throwError(exec, createSyntaxError(exec, "Error decoding audio file data"));
+
+ return toJS(exec, globalObject(), audioBuffer.get());
+ }
+
+ return jsUndefined();
+ }
+
+ // AudioBuffer createBuffer(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate);
+ if (exec->argumentCount() < 3)
+ return throwError(exec, createSyntaxError(exec, "Not enough arguments"));
+
+ unsigned numberOfChannels = exec->argument(0).toInt32(exec);
+ unsigned numberOfFrames = exec->argument(1).toInt32(exec);
+ float sampleRate = exec->argument(2).toFloat(exec);
+
+ RefPtr<AudioBuffer> audioBuffer = audioContext->createBuffer(numberOfChannels, numberOfFrames, sampleRate);
+ if (!audioBuffer.get())
+ return throwError(exec, createSyntaxError(exec, "Error creating AudioBuffer"));
+
+ return toJS(exec, globalObject(), audioBuffer.get());
}
} // namespace WebCore