summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/mediastream/media_stream_audio_track_underlying_sink.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/modules/mediastream/media_stream_audio_track_underlying_sink.cc')
-rw-r--r--chromium/third_party/blink/renderer/modules/mediastream/media_stream_audio_track_underlying_sink.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/modules/mediastream/media_stream_audio_track_underlying_sink.cc b/chromium/third_party/blink/renderer/modules/mediastream/media_stream_audio_track_underlying_sink.cc
new file mode 100644
index 00000000000..b4bc610ceb4
--- /dev/null
+++ b/chromium/third_party/blink/renderer/modules/mediastream/media_stream_audio_track_underlying_sink.cc
@@ -0,0 +1,78 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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/mediastream/media_stream_audio_track_underlying_sink.h"
+
+#include "third_party/blink/public/platform/platform.h"
+#include "third_party/blink/renderer/bindings/modules/v8/v8_audio_frame.h"
+#include "third_party/blink/renderer/modules/mediastream/pushable_media_stream_audio_source.h"
+#include "third_party/blink/renderer/modules/webcodecs/audio_frame.h"
+#include "third_party/blink/renderer/modules/webcodecs/audio_frame_serialization_data.h"
+#include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
+#include "third_party/blink/renderer/platform/wtf/functional.h"
+
+namespace blink {
+
+MediaStreamAudioTrackUnderlyingSink::MediaStreamAudioTrackUnderlyingSink(
+ PushableMediaStreamAudioSource* source)
+ : source_(source->GetWeakPtr()) {}
+
+ScriptPromise MediaStreamAudioTrackUnderlyingSink::start(
+ ScriptState* script_state,
+ WritableStreamDefaultController* controller,
+ ExceptionState& exception_state) {
+ return ScriptPromise::CastUndefined(script_state);
+}
+
+ScriptPromise MediaStreamAudioTrackUnderlyingSink::write(
+ ScriptState* script_state,
+ ScriptValue chunk,
+ WritableStreamDefaultController* controller,
+ ExceptionState& exception_state) {
+ AudioFrame* audio_frame = V8AudioFrame::ToImplWithTypeCheck(
+ script_state->GetIsolate(), chunk.V8Value());
+ if (!audio_frame) {
+ exception_state.ThrowTypeError("Null audio frame.");
+ return ScriptPromise();
+ }
+
+ if (!audio_frame->buffer()) {
+ exception_state.ThrowTypeError("Empty or closed audio frame.");
+ return ScriptPromise();
+ }
+
+ PushableMediaStreamAudioSource* pushable_source =
+ static_cast<PushableMediaStreamAudioSource*>(source_.get());
+ if (!pushable_source || !pushable_source->running()) {
+ exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
+ "Stream closed");
+ return ScriptPromise();
+ }
+
+ pushable_source->PushAudioData(audio_frame->GetSerializationData());
+ audio_frame->close();
+
+ return ScriptPromise::CastUndefined(script_state);
+}
+
+ScriptPromise MediaStreamAudioTrackUnderlyingSink::abort(
+ ScriptState* script_state,
+ ScriptValue reason,
+ ExceptionState& exception_state) {
+ if (source_)
+ source_->StopSource();
+ return ScriptPromise::CastUndefined(script_state);
+}
+
+ScriptPromise MediaStreamAudioTrackUnderlyingSink::close(
+ ScriptState* script_state,
+ ExceptionState& exception_state) {
+ if (source_)
+ source_->StopSource();
+ return ScriptPromise::CastUndefined(script_state);
+}
+
+} // namespace blink