v8::Handle<v8::Value> V8AudioContext::createBufferCallback(const v8::Arguments& args) { if (args.Length() < 2) return throwError("Not enough arguments", V8Proxy::SyntaxError); AudioContext* audioContext = toNative(args.Holder()); ASSERT(audioContext); v8::Handle<v8::Value> arg = args[0]; // AudioBuffer createBuffer(in ArrayBuffer buffer, in boolean mixToMono); if (V8ArrayBuffer::HasInstance(arg)) { v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(arg); ArrayBuffer* arrayBuffer = V8ArrayBuffer::toNative(object); ASSERT(arrayBuffer); if (arrayBuffer) { bool mixToMono = args[1]->ToBoolean()->Value(); RefPtr<AudioBuffer> audioBuffer = audioContext->createBuffer(arrayBuffer, mixToMono); if (!audioBuffer.get()) return throwError("Error decoding audio file data", V8Proxy::SyntaxError); return toV8(audioBuffer.get()); } return v8::Undefined(); } // AudioBuffer createBuffer(in unsigned long numberOfChannels, in unsigned long numberOfFrames, in float sampleRate); if (args.Length() < 3) return throwError("Not enough arguments", V8Proxy::SyntaxError); bool ok = false; int32_t numberOfChannels = toInt32(args[0], ok); if (!ok || numberOfChannels <= 0 || numberOfChannels > 10) return throwError("Invalid number of channels", V8Proxy::SyntaxError); int32_t numberOfFrames = toInt32(args[1], ok); if (!ok || numberOfFrames <= 0) return throwError("Invalid number of frames", V8Proxy::SyntaxError); float sampleRate = toFloat(args[2]); RefPtr<AudioBuffer> audioBuffer = audioContext->createBuffer(numberOfChannels, numberOfFrames, sampleRate); if (!audioBuffer.get()) return throwError("Error creating AudioBuffer", V8Proxy::SyntaxError); return toV8(audioBuffer.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")); int32_t numberOfChannels = exec->argument(0).toInt32(exec); int32_t numberOfFrames = exec->argument(1).toInt32(exec); float sampleRate = exec->argument(2).toFloat(exec); if (numberOfChannels <= 0 || numberOfChannels > 10) return throwError(exec, createSyntaxError(exec, "Invalid number of channels")); if (numberOfFrames <= 0) return throwError(exec, createSyntaxError(exec, "Invalid number of frames")); if (sampleRate <= 0) return throwError(exec, createSyntaxError(exec, "Invalid sample rate")); 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()); }