Index: third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp |
diff --git a/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp b/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp |
index 75fd1c8c35927d38d68d4a878a14dea3f0fe509e..51ed4572ec1167539f2595f2e877d5f41a3842a2 100644 |
--- a/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp |
+++ b/third_party/WebKit/Source/modules/webaudio/AudioWorkletGlobalScope.cpp |
@@ -8,13 +8,16 @@ |
#include "bindings/core/v8/NativeValueTraitsImpl.h" |
#include "bindings/core/v8/ToV8ForCore.h" |
#include "bindings/core/v8/V8BindingForCore.h" |
+#include "bindings/core/v8/V8ObjectBuilder.h" |
#include "bindings/core/v8/WorkerOrWorkletScriptController.h" |
#include "bindings/modules/v8/V8AudioParamDescriptor.h" |
+#include "core/dom/DOMTypedArray.h" |
#include "core/dom/ExceptionCode.h" |
#include "modules/webaudio/AudioBuffer.h" |
#include "modules/webaudio/AudioParamDescriptor.h" |
#include "modules/webaudio/AudioWorkletProcessor.h" |
#include "modules/webaudio/AudioWorkletProcessorDefinition.h" |
+#include "platform/audio/AudioUtilities.h" |
#include "platform/bindings/V8BindingMacros.h" |
#include "platform/bindings/V8ObjectConstructor.h" |
#include "platform/weborigin/SecurityOrigin.h" |
@@ -28,6 +31,8 @@ AudioWorkletGlobalScope* AudioWorkletGlobalScope::Create( |
v8::Isolate* isolate, |
WorkerThread* thread, |
WorkerClients* worker_clients) { |
+ LOG(INFO) << "AudioWorkletGlobalScope::RegisterProcessor thread = " |
+ << thread; |
return new AudioWorkletGlobalScope(url, user_agent, |
std::move(security_origin), isolate, |
thread, worker_clients); |
@@ -72,6 +77,7 @@ void AudioWorkletGlobalScope::registerProcessor( |
v8::Isolate* isolate = ScriptController()->GetScriptState()->GetIsolate(); |
v8::Local<v8::Context> context = ScriptController()->GetContext(); |
+ // Get a handle for the class definition (i.e. constructor) |
if (!class_definition.V8Value()->IsFunction()) { |
exception_state.ThrowTypeError( |
"The processor definition is neither 'class' nor 'function'."); |
@@ -81,6 +87,7 @@ void AudioWorkletGlobalScope::registerProcessor( |
v8::Local<v8::Function> class_definition_local = |
v8::Local<v8::Function>::Cast(class_definition.V8Value()); |
+ // Get a handle for |prototype| object out of class definition. |
v8::Local<v8::Value> prototype_value_local; |
bool prototype_extracted = |
class_definition_local->Get(context, V8String(isolate, "prototype")) |
@@ -90,6 +97,7 @@ void AudioWorkletGlobalScope::registerProcessor( |
v8::Local<v8::Object> prototype_object_local = |
v8::Local<v8::Object>::Cast(prototype_value_local); |
+ // Extract |process| function. |
v8::Local<v8::Value> process_value_local; |
bool process_extracted = |
prototype_object_local->Get(context, V8String(isolate, "process")) |
@@ -158,11 +166,12 @@ AudioWorkletProcessor* AudioWorkletGlobalScope::CreateInstance( |
v8::Local<v8::Object> instance_local; |
if (!V8ObjectConstructor::NewInstance(isolate, |
definition->ConstructorLocal(isolate)) |
- .ToLocal(&instance_local)) { |
+ .ToLocal(&instance_local)) { |
return nullptr; |
} |
- AudioWorkletProcessor* processor = AudioWorkletProcessor::Create(this, name); |
+ AudioWorkletProcessor* processor = |
+ AudioWorkletProcessor::Create(this, definition); |
DCHECK(processor); |
processor->SetInstance(isolate, instance_local); |
@@ -172,23 +181,43 @@ AudioWorkletProcessor* AudioWorkletGlobalScope::CreateInstance( |
return processor; |
} |
-bool AudioWorkletGlobalScope::Process(AudioWorkletProcessor* processor, |
- AudioBuffer* input_buffer, |
- AudioBuffer* output_buffer) { |
+bool AudioWorkletGlobalScope::Process( |
+ AudioWorkletProcessor* processor, |
+ AudioBuffer* input_buffer, |
+ AudioBuffer* output_buffer, |
+ HashMap<String, AudioFloatArray*> audio_param_data_map) { |
CHECK(input_buffer); |
CHECK(output_buffer); |
ScriptState* script_state = ScriptController()->GetScriptState(); |
+ v8::Isolate* isolate = script_state->GetIsolate(); |
+ |
ScriptState::Scope scope(script_state); |
- v8::Isolate* isolate = script_state->GetIsolate(); |
AudioWorkletProcessorDefinition* definition = |
FindDefinition(processor->GetName()); |
DCHECK(definition); |
+ V8ObjectBuilder parameters_object(script_state); |
+ |
+ for (const auto& param_name : audio_param_data_map.Keys()) { |
+ DOMFloat32Array* param_data_array = |
+ DOMFloat32Array::CreateOrNull(AudioUtilities::kRenderQuantumFrames); |
+ const float* source = audio_param_data_map.at(param_name)->Data(); |
+ float* destination = param_data_array->Data(); |
+ |
+ memcpy(destination, source, |
+ AudioUtilities::kRenderQuantumFrames * sizeof(float)); |
+ |
+ parameters_object.Add( |
+ StringView(param_name), |
+ ToV8(param_data_array, script_state->GetContext()->Global(), isolate)); |
+ } |
+ |
v8::Local<v8::Value> argv[] = { |
ToV8(input_buffer, script_state->GetContext()->Global(), isolate), |
- ToV8(output_buffer, script_state->GetContext()->Global(), isolate)}; |
+ ToV8(output_buffer, script_state->GetContext()->Global(), isolate), |
+ parameters_object.V8Value()}; |
// TODO(hongchan): Catch exceptions thrown in the process method. The verbose |
// options forces the TryCatch object to save the exception location. The |