blob: 38b39aad6582417260ca30c57f1c66a0a22564fc [file] [log] [blame]
Evan Liu28ec8bd2024-04-26 16:53:031// Copyright 2024 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/speech/speech_recognition_session.h"
6
7#include <memory>
8
9#include "base/functional/bind.h"
10#include "base/memory/weak_ptr.h"
11#include "content/browser/speech/speech_recognition_manager_impl.h"
12#include "mojo/public/cpp/bindings/pending_remote.h"
13#include "mojo/public/cpp/bindings/remote.h"
14
15namespace content {
16
17SpeechRecognitionSession::SpeechRecognitionSession(
Evan Liud7252282024-05-16 20:10:3218 mojo::PendingRemote<media::mojom::SpeechRecognitionSessionClient> client)
Evan Liu28ec8bd2024-04-26 16:53:0319 : client_(std::move(client)) {
20 client_.set_disconnect_handler(
21 base::BindOnce(&SpeechRecognitionSession::ConnectionErrorHandler,
22 base::Unretained(this)));
23}
24
25SpeechRecognitionSession::~SpeechRecognitionSession() {
26 // If a connection error happens and the session hasn't been stopped yet,
27 // abort it.
28 if (!stopped_) {
29 Abort();
30 }
31}
32
33base::WeakPtr<SpeechRecognitionSession> SpeechRecognitionSession::AsWeakPtr() {
34 return weak_factory_.GetWeakPtr();
35}
36
37void SpeechRecognitionSession::Abort() {
38 SpeechRecognitionManager::GetInstance()->AbortSession(session_id_);
39 stopped_ = true;
40}
41
42void SpeechRecognitionSession::StopCapture() {
43 SpeechRecognitionManager::GetInstance()->StopAudioCaptureForSession(
44 session_id_);
45 stopped_ = true;
46}
47
Yiren Wang23998562025-01-28 21:31:0548void SpeechRecognitionSession::UpdateRecognitionContext(
49 const media::SpeechRecognitionRecognitionContext& recognition_context) {
50 SpeechRecognitionManager::GetInstance()->UpdateRecognitionContextForSession(
51 session_id_, recognition_context);
52}
53
Evan Liu28ec8bd2024-04-26 16:53:0354// -------- SpeechRecognitionEventListener interface implementation -----------
55
56void SpeechRecognitionSession::OnRecognitionStart(int session_id) {
57 client_->Started();
58}
59
60void SpeechRecognitionSession::OnAudioStart(int session_id) {
61 client_->AudioStarted();
62}
63
64void SpeechRecognitionSession::OnSoundStart(int session_id) {
65 client_->SoundStarted();
66}
67
68void SpeechRecognitionSession::OnSoundEnd(int session_id) {
69 client_->SoundEnded();
70}
71
72void SpeechRecognitionSession::OnAudioEnd(int session_id) {
73 client_->AudioEnded();
74}
75
76void SpeechRecognitionSession::OnRecognitionEnd(int session_id) {
77 client_->Ended();
78 stopped_ = true;
79 client_.reset();
80}
81
82void SpeechRecognitionSession::OnRecognitionResults(
83 int session_id,
Evan Liud7252282024-05-16 20:10:3284 const std::vector<media::mojom::WebSpeechRecognitionResultPtr>& results) {
Evan Liu28ec8bd2024-04-26 16:53:0385 client_->ResultRetrieved(mojo::Clone(results));
86}
87
88void SpeechRecognitionSession::OnRecognitionError(
89 int session_id,
Evan Liud7252282024-05-16 20:10:3290 const media::mojom::SpeechRecognitionError& error) {
Evan Liu28ec8bd2024-04-26 16:53:0391 if (!client_.is_bound()) {
92 return;
93 }
Evan Liud7252282024-05-16 20:10:3294 client_->ErrorOccurred(media::mojom::SpeechRecognitionError::New(error));
Evan Liu28ec8bd2024-04-26 16:53:0395}
96
97// The events below are currently not used by speech JS APIs implementation.
98void SpeechRecognitionSession::OnAudioLevelsChange(int session_id,
99 float volume,
100 float noise_volume) {}
101
Evan Liu28ec8bd2024-04-26 16:53:03102void SpeechRecognitionSession::ConnectionErrorHandler() {
103 if (!stopped_) {
104 Abort();
105 }
106}
107
108} // namespace content