1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/webaudio/audio_worklet_object_proxy.h"
#include <utility>
#include "third_party/blink/renderer/core/workers/threaded_worklet_messaging_proxy.h"
#include "third_party/blink/renderer/core/workers/worker_thread.h"
#include "third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.h"
#include "third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.h"
#include "third_party/blink/renderer/modules/webaudio/cross_thread_audio_worklet_processor_info.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
namespace blink {
AudioWorkletObjectProxy::AudioWorkletObjectProxy(
AudioWorkletMessagingProxy* messaging_proxy_weak_ptr,
ParentExecutionContextTaskRunners* parent_execution_context_task_runners,
float context_sample_rate,
uint64_t context_sample_frame_at_construction)
: ThreadedWorkletObjectProxy(
static_cast<ThreadedWorkletMessagingProxy*>(messaging_proxy_weak_ptr),
parent_execution_context_task_runners,
/*parent_agent_group_task_runner=*/nullptr),
context_sample_rate_at_construction_(context_sample_rate),
context_sample_frame_at_construction_(
context_sample_frame_at_construction) {}
void AudioWorkletObjectProxy::DidCreateWorkerGlobalScope(
WorkerOrWorkletGlobalScope* global_scope) {
global_scope_ = To<AudioWorkletGlobalScope>(global_scope);
global_scope_->SetSampleRate(context_sample_rate_at_construction_);
global_scope_->SetCurrentFrame(context_sample_frame_at_construction_);
global_scope_->SetObjectProxy(*this);
}
void AudioWorkletObjectProxy::SynchronizeProcessorInfoList() {
DCHECK(global_scope_);
if (global_scope_->NumberOfRegisteredDefinitions() == 0) {
return;
}
std::unique_ptr<Vector<CrossThreadAudioWorkletProcessorInfo>>
processor_info_list =
global_scope_->WorkletProcessorInfoListForSynchronization();
if (processor_info_list->size() == 0) {
return;
}
PostCrossThreadTask(
*GetParentExecutionContextTaskRunners()->Get(TaskType::kInternalLoading),
FROM_HERE,
CrossThreadBindOnce(
&AudioWorkletMessagingProxy::SynchronizeWorkletProcessorInfoList,
GetAudioWorkletMessagingProxyWeakPtr(),
std::move(processor_info_list)));
}
void AudioWorkletObjectProxy::WillDestroyWorkerGlobalScope() {
global_scope_ = nullptr;
}
CrossThreadWeakPersistent<AudioWorkletMessagingProxy>
AudioWorkletObjectProxy::GetAudioWorkletMessagingProxyWeakPtr() {
return DownCast<AudioWorkletMessagingProxy>(MessagingProxyWeakPtr());
}
} // namespace blink
|